http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=97&page=show_problem&problem=1047
花了一上午,做了这一题,悲催啊.......主要是一些小问题没有注意到,一直WA........
就是大数处理,给两个相当长的大数,求乘积,算法很简单,用数组保存,然后模拟手算的方式,int x[],y[],用y的每一位乘以x,最终得结果.
一开始,没有注意到0的处理,WA了好几次,然后相加的时候忘记了处理进位.....相乘的过程倒是没有搞错进位......其实之前的晚上才做了两个大数相加......
都想放弃这一题了,反正自己知道怎么做,以为是什么规则错了或是其他什么地方错了而不是自己的结果错了,然后试试再看看,发现了问题!
看来知道做和做出来是两回事啊!
1 #include <stdio.h> 2 #include <string.h> 3 4 char chx[251],chy[251]; //读输入的字符串 5 int intx[251],inty[251],ans[501],anstemp[501]; 6 7 int ch_to_int(char arrch[],int arrin[]) //返回这个数字的长度 8 { 9 int len=strlen(arrch); 10 for (int i=0;i<len;i++) 11 { 12 arrin[i]=arrch[len-1-i]-48; 13 } 14 return len; 15 } 16 17 int main(void) 18 { 19 while (gets(chx)&&gets(chy)) 20 { 21 if (chx[0]=='0'||chy[0]=='0') 22 { 23 printf("0"); 24 } 25 else 26 { 27 memset(intx,0,sizeof(intx)); 28 memset(inty,0,sizeof(inty)); 29 memset(ans,0,sizeof(ans)); 30 31 /*原始长度----可能只是一个0,但是长度不为0*/ 32 int lenx=ch_to_int(chx,intx); 33 int leny=ch_to_int(chy,inty); 34 35 /*把y分解,分别乘x*/ 36 for (int i=0;i<leny;i++) 37 { 38 memset(anstemp,0,sizeof(anstemp)); 39 40 /*先乘,放到anstemp里,再在anstemp的前面加0*/ 41 int m,yushu=0,thislen=lenx; //余数,这次相乘后anstemp的长度 42 for (m=0;m<lenx;m++) 43 { 44 int temp=intx[m]*inty[i]+yushu; 45 anstemp[m]=temp%10; 46 yushu=temp/10; 47 } 48 if (yushu) //最后还有一个进位 49 { 50 anstemp[m]=yushu; 51 thislen++; 52 } 53 54 /*再移动,在数组开始加0*/ 55 /*把x先右移动i位,在空出的地方加0*/ 56 for (int n=0;n<i;n++) //移动i次 57 { 58 for (int j=thislen-1;j>=0;j--) //这只移动了一次 59 { 60 anstemp[j+1]=anstemp[j]; 61 } 62 anstemp[0]=0; //在后面加一个0 63 thislen++; //移动一次长度加一 64 } 65 66 /*再把anstemp和ans相加,模拟手算----------------注意这里的进位!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 67 int jinweiyicuo=0; //这里的进位反倒没有考虑.......... 68 for (int n=0;n<=500;n++) 69 { 70 int tempagain=ans[n]+anstemp[n]+jinweiyicuo; 71 ans[n]=tempagain%10; 72 jinweiyicuo=tempagain/10; 73 } 74 } 75 76 /*输出*/ 77 int m; 78 for (m=500;m>=0;m--) 79 { 80 if (ans[m]) 81 { 82 break; 83 } 84 } 85 for (int k=m;k>=0;k--) 86 { 87 printf("%d",ans[k]); 88 } 89 } 90 91 putchar('\n'); 92 } 93 return 0; 94 }