C语言。要输入一个超大数比如 111111111111111111111111111111111111111 怎样用字符串数组求各位的和呢?

char a[10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000];//题目要求是10的一百次方的数字,求这个数字能否被3整除。 求下面代码的错误之处 int n,b,c=0,m,i,j; scanf("%d",&n); for (j=0; j<n; j++)//输入n个测试用例 { gets(a);// 刚学。 从这到下面是真不会。。。 求指教、、、 while(a[i]!='\0') { scanf("%d",&a[i]); b=a[i]; c+=b; i++; } if (c==0) printf("Yes\n"); else printf("No\n"); 希望能指出代码的错误并求大数问题中字符数组的求法。 我知道要用字符串给字符数组然后每一个位数来处理。 可是代码总错、 求指教。 非常感谢、!

这个超大数不是10的100次方个数,而是一个数,只不过有100位,那么我们会用一个整型的数据存储,但没有相应的整型类型能存放这么大的数。
问题是:
-如果你想保留这个数,那么用一个字符串数组来存储每一位上的数字是可以的。
-你想计算是否能被3整除,那么你可以利用一个数学定理来完成这个计算,无需大内存,只要一小段程序即可,即:一个数能被3整除,那么这个数的每位上的数字的和能被3整除,比如12的两位数字之和是3,3能被3整除,那么12也能,21一样也能210,21000,同理都可以。那么你的计算就无需等待这个数都输入后再开始,而可以从每一位刚输入时就可以了。见下面程序:
int n,b,c=0,j; char a[101];
scanf("%d",&n);
for ( j=0;j<n;j++ )
{ do { b=getchar(); } while ( !(b>='0' && b<='9') ); //保证输入一位数字,输入整个大数后回车即可
a[j]=(b-'0'); c+=a[j]; //将输入的字符转换成数字,加到累加和上
}
if ( c%3 ) printf("No\n"); else printf("Yes\n");追问

明白了!谢谢老师的精彩回答!、很清晰!非常感谢!~

老师,以后有不会的还想请教~ 祝您生活开心!~^_^

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-19

    没有电脑能够开这么大的数组;

    10的一百次方,位数不会超过101,所以直接char a[101]就够了;

    可以用scanf来获取字符串scanf("%s",a);

    a[i]是字符,所以b应该等于: b=a[i] - '0';

    每一次外层循环的时候c没有初始化

    累加完毕后,c要mod除3,判断余数是否等于0,而不是c;


自行实现的代码如下:


#include <stdio.h>


int main()

{

int n;

scanf("%d",&n);

for (int i=0;i<n;i++)

{

char A[101];

scanf("%s",A);

int num = 0;

for (int j=0;A[j]!='\0';j++)

num += (A[j] - '0');

num %= 3;

if (!num)

printf("YES\n");

else

printf("NO\n");

}

return 0;

}

追问

哦,非常感谢!

第2个回答  2013-11-19

main()

{

 char a[201];                /*能处理200位(即10^200-1)以内的数*/

 int s=0,n,i,j;

 scanf("%s",&a);

 for (i=0; a[i]>='0'&&a[i]<='9';i++)

   s+=a[i]-'0';

 if(s%3==0)printf("Yes\n");  

   else printf("No\n"); 

}

相似回答