将数字的数字存储在数组中
storing digits of a number in array
如何在任何数组中存储整数的不同数字
像 1234 到 {1,2,3,4}
可以使用 char str[]="1234"; printf("%c",str[0];
来完成
但是如何在不使用字符串和整数本身的情况下做到这一点
这是一个创建数字数组并将其打印出来的片段:
#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
以包含 log
和 ceil
所需的数学库。另请注意,打印代码不适用于大于 10 的基数。
这是一种或多或少的方法:
取整数的log10()
确定其'size'
取 floor()
得到指数(位数 - 1)
然后用(int)pow(10, exponent)
计算最高分频器
终于有了一个 for
循环:
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
}
详情留给你填写
当第一个答案出现时,我正在写我的回复。这会很好用。中间的循环基本上隔离了每个数字,方法是删除它前面的所有数字,然后在将其添加到数组之前将其划分到个位。
如果您的编译器支持可变长度数组,那么您可以使用下面演示程序中显示的方法
#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 ) );
您不需要在运行时计算给定整数 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]);
如果你想存储它们in-order:
// 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]);
这里有一个稍微不同的方法。虽然它没有考虑整数的大小,但它是直截了当的并将每个数字存储在数组中,同时从左到右移动数字:
/* 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;
}
如何在任何数组中存储整数的不同数字
像 1234 到 {1,2,3,4}
可以使用 char str[]="1234"; printf("%c",str[0];
来完成
但是如何在不使用字符串和整数本身的情况下做到这一点
这是一个创建数字数组并将其打印出来的片段:
#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
以包含 log
和 ceil
所需的数学库。另请注意,打印代码不适用于大于 10 的基数。
这是一种或多或少的方法:
取整数的
log10()
确定其'size'取
floor()
得到指数(位数 - 1)然后用
计算最高分频器(int)pow(10, exponent)
终于有了一个
for
循环: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 }
详情留给你填写
当第一个答案出现时,我正在写我的回复。这会很好用。中间的循环基本上隔离了每个数字,方法是删除它前面的所有数字,然后在将其添加到数组之前将其划分到个位。
如果您的编译器支持可变长度数组,那么您可以使用下面演示程序中显示的方法
#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 ) );
您不需要在运行时计算给定整数 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;
另一种解决方法是
#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]);
如果你想存储它们in-order:
// 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]);
这里有一个稍微不同的方法。虽然它没有考虑整数的大小,但它是直截了当的并将每个数字存储在数组中,同时从左到右移动数字:
/* 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;
}