http://poj.org/problem?id=1001
POJ的前几道题理解起来很简单,算法也不复杂,只是需要花很长的时间去调试。1001本质上就是一个大数运算的问题,大数乘法的问题可以采用分治法,具体参考这篇文章:http://blog.csdn.net/tjsinor2008/article/details/5625849。代码如下:
1 #include<stdio.h> 2 #include<memory.h> 3 4 unsigned char a[200],b[200],c[200]; 5 int lenA,lenB,maxlen,digit,p; /*a[200],b[200],c[200]用来存储数据,底数去掉小数点以后存储在a里面,从高位到低位每一位储存一个数字,b保存每次乘法的结果,将该结果加上小数点并去掉0前缀和后缀存在c里面,最后打印出来。要注意数组的长度*/ 7 int strlength(char* s) 8 { 9 int result=0; 10 while(*s!=0) 11 { 12 result++; 13 s++; 14 } 15 return result; 16 } 17
/*乘法函数的关键在于对c[i+j+1]和c[i+j]修改赋值的这个循环,仔细想想不难理解。需要注意的是c[i+j]+=(c[i+j+1]-'0')/10这一句可能会导致在循环结束的时候有数组的元素大于‘9’,所以最后需要再重新对计算结果从后往前遍历一遍,将该进位的进位。*/ 18 void mul(unsigned char* a,unsigned char* b) 19 { 20 int i,j; 21 lenA=strlength(a); 22 lenB=strlength(b); 23 maxlen=lenA+lenB; 24 25 for(i=0;i<maxlen;i++) 26 { 27 c[i]='0'; 28 } 29 c[maxlen]='