原题链接:蓝桥杯算法提高VIP-高精度乘法
解题思路: 将从终端读取到的数字从低位开始依次存放到数组中,以便解决结果数位数增加的问题
注意事项: 在乘数每一位数依次与被乘数相乘时,要记住本次计算的结果数的最高位的可能是大于9,应当在每次乘完后处理。
参考代码:
#include<stdio.h> #include<string.h> int d1,d2; //存放s1,s2的长度 void transform(char s[],int a[]){ //字符转为数字 int i,k; k=strlen(s); for(i=0;i<k;i++) a[i]=(int)s[k-1-i]-48; } void mutiple(int a[],int b[],int c[],int *d){ //相乘 int i,j,k; for(i=0;i<d2;i++){ k=i; for(j=0;j<d1;j++,k++) { c[k+1]+=(a[j]*b[i]+c[k])/10;//进位的数加到下一位上(注意这样可能产生c[k+1]>9的情况) c[k]=(a[j]*b[i]+c[k])%10; } if(c[k]>9){ c[k+1]+=(a[j]+b[i]+c[k])/10; /*在解决掉每次计算时最高位上出现的c[k+1]>9的情况,即 再向高位进位*/ c[k]=c[k]%10; } } if(c[k]!=0) k++; //如果高1位不为0,该位有效 *d=k; } int main(){ int a[10000],b[10000]; int c[20002]={0}; int i,d; char s1[10001],s2[10001]; scanf("%s%s",s1,s2); transform(s1,a); transform(s2,b); d1=strlen(s1); d2=strlen(s2); mutiple(a,b,c,&d); for(i=d-1;i>=0;i--) printf("%d",c[i]); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复