我有一项任务,要求我首先设置整数数组来存储任意大数。通过使用int数组的每个元素,我可以为每个元素保留一个数字,因为int变量类型是32位,并且在失败之前最多只能达到大约20亿。我知道有其他库使用BigInt,但我想改造自己的数组。
我测试了我的代码,但它似乎没有接受超过9位的值,直到它开始失败。
int * toArray(int, int);
int main()
{
int n, *res, counter, i;
printf("Input: ");
scanf("%d", &n);
while(n>0){
n/=10;
counter++;
}
res = toArray(n, counter);
for(i=1;i<=counter;i++){
printf("%d", *(res)+i);
}
printf("\n");
}
int * toArray(int n, int counter)
{
int i;
int *numberArray = malloc(sizeof(int) * counter);
for(i=0; i< counter; i++)
{
numberArray[i] = n % 10;
}
return numberArray;
}
我希望至少能够接受近二十位的数字。我知道这可以用int数组完成,尽管char数组(或字符串)也是可能的。但我想使用int数组。任何帮助理解为什么它失败大约9位数和过去的建议将非常感谢。谢谢。
答案 0 :(得分:4)
问题是你正在从键盘上读取一个int
scanf("%d", &n);
因此,无论您输入多少位数,您仍然只能获得9位数字。
为了能够输入任意数字,您必须将其作为字符串读取,然后将其转换为您的int数组。
修改强>
这种方式(例如)允许20位数
char ch;
int digits[20];
int i = 0;
do
{
ch = fgetc(stdin);
if ( isdigit(ch) )
{
digits[i++] = ch - 48; // convert ASCII to int
}
}
while (isdigit(ch) && i < sizeof(digits)/sizeof(digits[0]));
答案 1 :(得分:0)
#include<stdio.h> #include<stdlib.h> int *toArray(long long int n, int counter); int main() { long long int n=0,copy_of_n=0; int counter=0, i=0; int *res=NULL; printf("Input: "); scanf("%lld", &n);//Refer note in the answer copy_of_n=n;//see the while loop why use this. while(n>0){ n/=10;//Good, but you are not storing it. copy_of_n does that. counter++;//You didn't initialize this } res=toArray(copy_of_n, counter); for(i=counter-1;i>=0;i--){//This ensures you get the numbers in a proper order and since index starts from 0 in the toArray function printf("%d", res[i]); } printf("\n"); free(res);//You forgot this return 0; } int *toArray(long long int n, int counter) { int i=0; int *numberArray = malloc(sizeof(int) * counter); memset(numberArray,0x00,counter*sizeof(int));//Good to do this //Check for memory allocation for(i=0; i< counter; i++) { numberArray[i] = n % 10; n=n/10LL;//You have to remove the digits too } return numberArray; }
注意:在while中循环读取小部分的整数,因为long long
具有可存储的位数限制。另一种方法是存储在字符串中并将字符串拆分为最大值。没有。可以存储在long long
变量n
中的数字,并将其分别发送给函数。
long long
大小取决于实现,因此请确保检查最大值。没有。它可以容纳的数字。(它会绕过你所要求的9位数限制)