3

我有一个任务要求我首先设置整数数组来存储任意大的数字。通过使用 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 位数左右失败以及过去的建议将不胜感激。谢谢你。

4

2 回答 2

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]));
于 2012-11-04T18:13:57.347 回答
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 位数限制)

于 2012-11-04T20:13:31.863 回答