原题链接:蓝桥杯算法提高VIP-高精度乘法
解题思路:
输入1---->用字符串in1存储---->逆序转换成为数组a----->同理输入2,最后相乘用一个ans存下来,逆序输出即可
参考代码:
#include<bits/stdc++.h> #define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); using namespace std; const int maxn=100005; int a[maxn],b[maxn],ans[maxn]= {0}; int flag=0,anslen=0; char in1[maxn],in2[maxn]; void calp() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int len1=strlen(in1),len2=strlen(in2); for(int i=0,j=len1-1; i<len1; i++,j--) { a[i]=in1[j]-'0'; } for(int i=0,j=len2-1; i<len2; i++,j--) { b[i]=in2[j]-'0'; } int maxlen=(len1>len2)?len1:len2; flag=0; for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { ans[j+flag]+=(a[i]*b[j]); if(ans[j+flag]>=10) { int temp=ans[j+flag]/10; ans[j+flag+1]+=temp; ans[j+flag]%=10; } } flag++; } anslen=maxlen+flag; } int main() { hh; memset(in1,0,sizeof(in1)); memset(in2,0,sizeof(in2)); cin>>in1; cin>>in2; calp(); for(int i=anslen; i>=0; i--) { if(ans[i]!=0) { for(; i>=0; i--) { cout<<ans[i]; } } } cout<<endl; return 0; }
后来又写了一份,比上一份好看一些
#include<bits/stdc++.h> #define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); using namespace std; const int maxn=1000005; string str1,str2; int a[maxn],b[maxn],ans[maxn]; int main() { hh; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(ans,0,sizeof(ans)); cin>>str1>>str2; int len1=str1.length(); int len2=str2.length(); //逆序,字符改整形储存 for(int i=0,j=len1-1; i<len1; i++,j--) { a[i]=str1[j]-'0'; } for(int i=0,j=len2-1; i<len2; i++,j--) { b[i]=str2[j]-'0'; } //模拟手算 //int big_len=(len1>len2)?(len1):len2; int pos; for(int i=0; i<len1; i++) { for(int j=0,k=i; j<len2; j++,k++) { ans[k]+=a[i]*b[j]; if(ans[k]>=10) { ans[k+1]+=ans[k]/10; ans[k]%=10; } pos=k; } } //输出 for(int i=pos+1; i>=0; i--) { if(ans[i]!=0) { for(; i>=0; i--) { cout<<ans[i]; } } } return 0; }
每次考前必须要来这里过一遍大数乘法!
#include<bits/stdc++.h> #define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; const int maxn=100005; string inp_a,inp_b; int a[maxn]={0},b[maxn]={0},ans[maxn]={0}; void mult(){ int lena=inp_a.length(); int lenb=inp_b.length(); for(int i=0,j=lena-1;i<lena;i++,j--){ a[j]=inp_a[i]-'0'; } for(int i=0,j=lenb-1;i<lenb;i++,j--){ b[j]=inp_b[i]-'0'; } int larg_pos=0; for(int i=0;i<lena;i++){ int pos=i; for(int j=0;j<lenb;j++){ ans[pos++]+=(a[i]*b[j]); if(larg_pos<pos){ larg_pos=pos; } } } for(int i=0;i<larg_pos;i++){ if(ans[i]>=10){ ans[i+1]+=ans[i]/10; ans[i]%=10; } } for(int i=larg_pos+10;i>=0;i--){ if(ans[i]!=0){ for(;i>=0;i--){ cout<<ans[i]; } } } } int main(){ hh; cin>>inp_a; cin>>inp_b; mult(); cout<<endl; return 0; }
PS:蓝桥杯国赛加油! ---19/5/24
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复