请求C语言高手。为什么此程序只能带一个0,就是10*10=100没问题,而100*100!=10000了

#include<stdio.h>
#include<string.h>
int main()
{ char a[200];char b[200];int e[400][400];int f[400];int g[400];
int i,j,m,n,d,y,t;
t=0;
gets(a);
gets(b);

m=strlen(a);//2
n=strlen(b);//2
d=m+n;
for(i=0;i<strlen(a);i++)//10
a[i]=a[i]-'0';
for(j=0;j<strlen(b);j++)
b[j]=b[j]-'0';

//4
for(i=0;i<d;i++)
{g[i]=0;}
for(i=0;i<400;i++)
for(j=0;j<400;j++)
{
e[i][j]=0;
}

for(j=0;j<n;j++)//0 m=2
{ for(i=0;i<m;i++)//0 n=2
{
f[i+j]=a[i]*b[j];//f[0]=a[0]*b[0]=9 f[1]=a[0]*b[1]=9 f[1]=a[1]*b[0]
e[j][i+j]=f[i+j];//e[0][0]=f[0]=9 e[0][1]=f[1]=9 e[1][1]=f[1]=9

}

}

for(j=0;j<d;j++)

{
for(i=0;i<n;i++)
{
g[j]+=e[i][j];

}

}

for(j=d-1;j>=1;j--)
{
if(g[j]>=10)
{
t=g[j]/10;
g[j]=g[j]%10;

g[j-1]=g[j-1]+t;

}
}

for(j=0;j<d-1;j++)
{
printf("%d",g[j]);
}

}

求高手指出哪错了并修改
//后的内容不用看!那是我分析时用的...还有,本程序是大整数乘法的程序....

改了一下,原因在注释里。可续问。
#include<stdio.h>
#include<string.h>
void main(void){/*主程序*/
char a[200],b[200];
int e[400]/*[400]*/={0,},f[400]={0,},g[400]={0,},i,j,m,n,d,t=0;//用不着二维数组,并初始化

gets(a);
gets(b);

m=strlen(a);//2
n=strlen(b);
d=m+n;
for(i=0;i<m/*strlen(a)*/;i++)//这里改成m,少消耗点时间
e[i]=a[i]-'0';//这里要放在int数组里,char型最大数是127,乘数太长时要出错
for(j=0;j<n/*strlen(b)*/;j++)//同上上一句
g[j]=b[j]-'0';//同上上一句

//4已在声明时初始化,这里用不着了
//for(i=0;i<d;i++)
// g[i]=0;
//for(i=0;i<400;i++)
//for(j=0;j<400;j++)
// e[i]=0;//[j]

for(j=0;j<n;j++){//0 m=2
for(i=0;i<m;i++){//0 n=2
f[i+j]+=e[i]*g[j];//这里改成+=就不要下面那句了,那句逻辑太乱
/*e[j][i+j]=f[i+j];*///e[0][0]=f[0]=9 e[0][1]=f[1]=9 e[1][1]=f[1]=9
}
}

//for(j=0;j<d;j++){//前面所改已包括了这一段的意思
// for(i=0;i<n;i++)
// g[j]+=e[i][j];
//}

for(j=d-1;j>=1;j--){//这一段把g[]改成f[],因为位积在f[]里
if(f[j]>=10){
t=f[j]/10;
f[j]=f[j]%10;
f[j-1]=f[j-1]+t;
}
}
if(!f[0]) d=2;//加一句,
for(j=0;j<d-1;j++)
printf("%d",f[j]);
printf("\n");//加一句
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-16
一个明显错误 a[i]=a[i]-'0';
b[j]=b[j]-'0';
我知道你是想得到数字,但是呢,你这两个数组都是char型的,放里面都是按照ASCII值存放的,这样的话你小于255的数都能表示。但是超过了就不行了,并且你这样写也是错误的算法,得不到你要的那个值,出现了你描述的现象,你可以不用把他们放里面啊,用的时候先减再弄不就好了,不必要在把算出的值保存起来。
第2个回答  2011-12-16
能告诉我你这是要干神马吗??看了半天没明白你这是要干神马。。。。。追问

大整数乘法。。。。可是不能带2个0;例如10*10=100但100*100不等于10000.

第3个回答  2011-12-16
这程序要干什么啊!!!!!!!!!!!!!!!!追问

大整数乘法。。。。可是不能带2个0;例如10*10=100但100*100不等于10000.

继续求C语言高手帮小弟解答这个问题。在线等回答。麻烦了。为什么结果...
i,j,定义为整型,当i!=j时 (i\/j)=(j\/i)=0 所以会出现上述情况

c语言 求100!的位数及其具体数值。
1.求100! 肯定不能用楼上方法 没有那么大的数据结构存 给你说个方法(算到1000都没问题):用数组表示结果数字每一位的数字 刚才用计算器看了一下 100!有10的100多次方 所以你开个 200的数组肯定够了 然后从2算起 a【0】存2 比如算到3 a【0】存6 然后到4就有进位 所以a【0】存4 a...

C语言编程求100的阶乖,末尾有多少个零
以C语言的数据类型来求100的阶乘不造成数据过大溢出是不现实的,所以不能在求得100的阶乘之后再数它末尾有多少个0,只能在累乘的过程中遇到一个0就干掉,最后数总共干掉了多少个,至于由于溢出前面丢掉了多少位的数就管不了了,代码如下:main(){ long a=1;int i,n=0;for(i=2;i<=100;i++){ ...

C语言,如何提高结果的输出位数,现最高为10位
你这个程序的作用是求一个数字的阶乘,但是能够计算的数字很有限,13!=6227020800就已经超过了long所能够表示的范围,所以不能用整形数来表示,只能用字符串或者数组来表示。下面就介绍一个用数组表示大数阶乘的问题的程序。\/*下面这个代码把40以内的数字的阶乘都打印出来,也可修改程序打印固定数字的阶乘,...

求用c语言编写一个程序,求10000以内含有数字4的数的个数
这是数学问题,相当于排列组合问题。求N个数字以内的含有M的方法,对于以上问题即求4个数字(9999)以内含有4的个数。千位为"4"的个数是10*10*10;百位、十位、个位为"4"的个数也是10*10*10;所以10000以为的个数为4000个,公式为:N*pow(10, N-1);但是这里面有重复,例如"4444"都满足上面4...

C语言如何用FOR循环输出10、100、1000、10000、100000
楼上的你输出5个数字用10000次循环不怕累死啊。。。include <stdio.h> include <math.h> void main(){ for(int i = 1;i< 6;i++){ int a = pow(10,i);printf("%d,",a);} }

c语言编程:100的阶乘有多少个零
len++, sj->data[j] = inc, inc = 0;} sj->len = len;} \/*算法1*\/ int countzero_1(NUM*sj){ int i = 0, k ,n;while (sj->data[i]==0)i++;n = sj->data[i];k = 0;while (n%10==0)n\/=10,k++;return i * 5 + k;} \/*算法2*\/ int countzero_2(int ...

高分求编程题程序(C语言)
2.你的例子到底是二进制还是十六进制?为什么0是000000b?3.输入是什么?文本文件?还是从终端输入?密匙是提前决定还是程序运行的时候决定?4.这个还好。试着做做吧。5.这个无聊到极点,要不要把全国各种方言的说法也都给你算上?讲清楚了再提问,否则10000分也没人给你做。这是第四题的,虽说答案...

100!的准确结果 用c语言怎么算
我找的程序,不是我写的.不过能算100! .如果把int arr[1000]的数组开大足够大的话,10000!也可以算.include<stdio.h> include<conio.h> int arr[1000]={0};void mul(int arr[],int n,int *len){ int c=0,i,l=*len;for(i=0;i<l;i++){ arr[i]=arr[i]*n+c;c=arr[i]\/10...

1*10*100*1000...的c语言程序怎么写
include <stdio.h>\/\/1*10*100*1000*10000...的c语言程序怎么写\/\/至少有两种思路,一种是写个大数类,再直接算乘法\/\/二是偷个懒,计算结果会有几个0,直接输出结果\/\/1*10*100*1000*10000*...*1(n-1个0)\/\/0 1 2 3 4 。。。 n-1 \/\/类加,即结果会有 (1+n-1...

相似回答