大数相乘(小数点)

大数相乘的实例,网上的实现很多,但是总给人一种模糊的感觉,不加注释,盲目抄袭。

 

#include<stdio.h> #include<string.h> main() { char str1[101],str2[101], * pos1, * pos2; //定义字符串str1, str2,来容纳两个大数, 指针pos1,pos2分别指向小数点的位置 static unsigned c[202] ={0}, //字符串c用来容纳结果,初始化为权威0, w1 =0, //w1,w2,分别保存小数点后的位数 w2 = 0, n1,n2, i,j; printf("Input the first num:/n"); scanf("%s", str1); printf("Input the second num:/n"); scanf("%s", str2); printf("/n %s * %s = ",str1,str2); pos1 = strchr(str1,'.'); //指向第一个字符串的小数点位置 pos2 = strchr(str2,'.'); //指向第二个字符串的小数点位置 if(pos1 != 0) { //如果str1存在小数点 *pos1 = '/0'; //把小数点位置置为'/0',用来实现下面小数点后的字符串和小数点前的字符串连接 ++pos1; w1 = strlen(pos1); //用来保存小数点后的位数 strcat(str1,pos1); } if(pos2 != 0) { //如果str2存在小数点 *pos2 = '/0'; ++pos2; w2 = strlen(pos2); strcat(str2,pos2); } n1 = strlen(str1); //记下当前的str1,str2的位数(不包括小数点的) n2 = strlen(str2); for(i = 0; i < n1; ++i) //for循环实现相乘,就像竖式相乘一样,只是没有处理进位 for(j =0; j < n2; ++j) c[i+j+1] +=(str1[i] -'0')*(str2[j] -'0'); for(i = n1+n2-1; i > 0; --i) //处理进位 if(c[i] >= 10) { c[i-1] += c[i]/10; c[i] %= 10; } if(c[0] != 0) //处理结果,如果第一位不是0则输出 printf("%lu", c[0]); for( i = 1; i <= n1+n2-(w1+w2)-1; ++i) //输出小数点前的字符 printf("%lu",c[i]); if(w1+w2 != 0){ //输出小数点后(包括小数点)的字符 printf("."); for(i = n1+n2-(w1+w2); i < n1+n2; ++i) { printf("%lu",c[i]); } } printf("/n"); } 

 

在gcc 4.4.5下运行,

 

wolf@debian:~$ ./big Input the first num: 32473294713247.123456789 Input the second num: 89189373438247234123.987654321 32473294713247.123456789 * 89189373438247234123.987654321 = 2896272808950057326138266156261338.934233965112635269


 

有时间的话,再封装成函数,尽量优化一下。

你可能感兴趣的:(大数相乘(小数点))