大数相乘
发布时间:2020-12-14 03:29:26 所属栏目:大数据 来源:网络整理
导读:受计算机变量大小限制。当乘数过大时,计算机无法进行乘法,必须自己想法予以实现。 本程序可处理带小数的大数乘法运算。 运算结果正确。可以将前几年破解的 RSA-158 密码来试验 // 前几年破解的 RSA-158 密码是这样因数分解的 // result :39505874583265144
受计算机变量大小限制。当乘数过大时,计算机无法进行乘法,必须自己想法予以实现。 本程序可处理带小数的大数乘法运算。 运算结果正确。可以将前几年破解的 RSA-158 密码来试验 // 前几年破解的 RSA-158 密码是这样因数分解的 // result :39505874583265144526419767800614481996020776460304936454139376051579355626529450683609727842468219535093544305870490251995655335710209799226484977949442955603 // part1:3388495837466721394368393204672181522815830368604993048084925840555281177 // part2:11658823406671259903148376558383270818131012258146392600439520994131344334162924536139 运算时,先将乘数都反转。即倒着乘,主要是防止进位时没有空间了。最后将结果也反转输出即可 如12345 * 23 第一步 12345 -> 54321,23 ->32 第二步 相乘并进位后 539382 第三步 反转输出 283935 完成。 源代码如下:// // bignum.c // 完成有小数位的俩个大数的乘法 // Created by GPH on 13-7-14. // Copyright (c) 2013年 GPH. All rights // #include<stdio.h> #define NUM_RESULT 200 #define NUM_PART 100 void convert(char *a,int *b); void bigNumberMul(char *a,char*b,int count); int split(char *a,char*b); //先将字符串反转。 //再字符型数字转为数字,存在整形数组中,为乘法做准备 //若是高位放在数组头部,则进位时可能没有空间 //所以将低位放在数组头部。高位放尾部。 //输出时倒序即可 void convert(char *a,int *b) { int l = strlen(a); char temp; for (int i = 0; i < l/2; i++) { temp = a[i]; a[i] = a[l-i-1]; a[l-i-1] = temp; } for (int i = 0; i < l; i++) { b[i] = a[i]-'0'; } } //逐位相乘,再进位 void bigNumberMul(char *a,int count) { int ih[NUM_RESULT]={}; int ia[NUM_PART]; int ib[NUM_PART]; convert(a,ia); convert(b,ib); for (int i = 0; i < strlen(a); i++) { for ( int j = 0; j < strlen(b); j++) { ih[i+j] += ia[i]*ib[j]; } } //逐次进位 for (int i = 0; i < NUM_RESULT-1; i++) { ih[i+1] += ih[i]/10; ih[i] %= 10 ; } int i; for ( i = NUM_RESULT-1;i >= 0 ; i--) { if (ih[i]) { break; } } for ( ;i >= 0 ; i--) { if(i == count-1) { printf("."); } printf("%d",ih[i]); } } //统计小数位共多少。并删除"."号 //用来最终输出时,确定小数位数 int split(char *a,char*b) { int sum = 0; for (int i = 0;i< strlen(a) ; i++) { if(a[i] == '.') { //前移,删除'.' for (int j = i; j < strlen(a)-1 ; j++) { a[j] = a[j+1]; } sum += strlen(a)-i-1; a[strlen(a)-1] = ' '; break; } } for (int i = 0;i< strlen(b) ; i++) { if(b[i] == '.') { //前移,删除'.' for (int j = i; j < strlen(b)-1 ; j++) { b[j] = b[j+1]; } sum += strlen(b)-i-1; b[strlen(b)-1] = ' '; break; } } return sum; } int main(int argc,const char * argv[]) { char a[NUM_PART]; char b[NUM_PART]; int count; printf("input:"); scanf("%s",a); printf("input:"); scanf("%s",b); printf("n"); getchar(); count = split(a,b);//统计小数位 bigNumberMul(a,b,count); printf("n"); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |