3

任意の大きな数値を格納するために、最初に整数配列を設定する必要がある割り当てがあります。int 配列の各要素を使用することで、要素ごとに 1 桁を保持できます。これは、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;
}

せめて20桁近くまで受け付けるようにしたいです。char 配列 (または文字列) も可能ですが、これは int 配列で実行できることを知っています。しかし、代わりに 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; }

long long注:格納できる桁数には制限があるため、整数を小さな部分にループして読みます。別のアプローチは、文字列に格納し、文字列を正確に最大に分割して送信することです。番号。long long変数に格納してn関数に部分的に送信できる桁数。

long longサイズは実装に依存するため、最大値を確認してください。番号。収容できる桁数(もちろん、質問された9桁の制限をバイパスします)

于 2012-11-04T20:13:31.863 に答える