如何將整數的不同數字存盤在任何陣列中,例如 1234 到 {1,2,3,4} 它可以使用char str[]="1234"; printf("%c",str[0];
但如何在不使用字串和整數本身的情況下完成
uj5u.com熱心網友回復:
這是一個創建數字陣列并將它們列印出來的片段:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// Print digits 1 by 1
void numToDigits (int number, int base) {
int i;
int n_digits = (int)ceil(log(number 1) / log(base));
printf("%d digits\n", n_digits);
int * digits = calloc(n_digits, sizeof(int));
for (i=0; i<n_digits; i) {
digits[i] = number % base;
number /= base;
}
// digits[0] is the 1's place, so print them starting from the largest index
for (i=n_digits-1; i>=0; --i) {
printf("%d", digits[i]);
}
printf("\n");
free(digits);
}
你可能想要修改它,但我認為它暴露了所有重要的想法。編譯時不要忘記添加和-lm所需的數學庫。另請注意,列印代碼不適用于大于 10 的堿基。logceil
uj5u.com熱心網友回復:
這是一種或多或少的方法:
獲取
log10()整數以確定其“大小”取
floor()那個得到指數(位數 - 1)然后計算最高分頻器
(int)pow(10, exponent)最后有一個
for-loop:int value = 1234; // Your value to split up in digits. for (int d = divider; divider > 0; divider /= 10) { int digit = value / d; value = value / 10; // Store digit in array }
我把詳細資訊留給你填寫。
卡森有一個類似的想法,它很好地避免了使用pow()
uj5u.com熱心網友回復:
如果您的編譯器支持可變長度陣列,那么您可以使用下面演示程式中顯示的方法
#include <stdio.h>
enum { Base = 10 };
size_t size( unsigned int x )
{
size_t n = 0;
do { n; } while ( x /= Base );
return n;
}
int main( void )
{
unsigned int x = 0;
printf( "Enter a non-negative number: " );
scanf( "%u", &x );
size_t n = size( x );
unsigned int digits[n];
for ( size_t i = n; i != 0; x /= Base )
{
digits[--i] = x % Base;
}
for ( size_t i = 0; i < n; i )
{
printf( "%u", digits[i] );
}
putchar( '\n' );
}
程式輸出可能看起來像
Enter a non-negative number: 123456789
123456789
如果編譯器不支持可變長度陣列,那么您將需要動態分配陣列,例如
unsigned int *digits = malloc( n * sizeof( unsigned int ) );
uj5u.com熱心網友回復:
您不需要n在運行時計算給定整數中有多少位。您可以檢查編譯器的<limits.h>最大位數int。
int n = 124343;
int digits[10]; // INT_MAX is 10-digit long on x86 and x64 (GCC and Clang)
int ndigits;
另一種解決方案是使用宏預先計算(@chux)最大位數:
#define INT_DIGIT10_WIDTH ((sizeof(int)*CHAR_BIT - 1)/3 1)
int digits[INT_DIGIT10_WIDTH];
剩下的很簡單:
// Digits are stored in reverse order
for (ndigits = 0; n; n /= 10)
digits[ndigits ] = n % 10;
for (int i = ndigits - 1; i > 0; --i)
printf("%d\t", digits[i]);
如果要按順序存盤它們:
// Digits are stored in reverse order
for (ndigits = 0; n; n /= 10)
digits[ndigits ] = n % 10;
// Reverse digits by swapping every two parallel elements
for (int i = 0, j = ndigits-1; i < j; i, --j) {
int tmp = digits[i];
digits[i] = digits[j];
digits[j] = tmp;
}
for (int i = 0; i < ndigits; i)
printf("%d\t", digits[i]);
uj5u.com熱心網友回復:
這是一種略有不同的方法。雖然它沒有考慮整數的大小,但它是直截了當的,并將每個數字存盤在陣列中,同時在數字上從左到右移動:
/* store the separate digits of an integer in the elements of an integer array
*/
#include <stdio.h>
int main (void)
{
int number = 1234500;
printf("\nnumber = %d\n\n", number);
int nDigits = 1;
int power = 1; // power = mult of 10 matching left digit
while (number / power > 9) {
nDigits;
power *= 10;
}
int digits[10];
for (int i = 0; i < nDigits; i) {
digits[i] = number / power;
number %= power; // drop left-most digit from number
power /= 10; // adjust multiple of 10
}
for (int i = 0; i < nDigits; i) {
printf("digits[%d] = %d\n", i, digits[i]);
}
return 0;
}
uj5u.com熱心網友回復:
當第一個答案出現時,我正在寫我的回復。這將作業得很好。中間的回圈基本上通過洗掉它前面的所有數字來隔離每個數字,然后在將其添加到陣列之前將其劃分到一個位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473156.html
下一篇:使用esp_now發送資料
