用于存储大数字(超过20位)的Int数组

时间:2012-11-04 18:08:41

标签: c arrays

我有一项任务,要求我首先设置整数数组来存储任意大数。通过使用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位数和过去的建议将非常感谢。谢谢。

2 个答案:

答案 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位数限制)