原题链接:蓝桥杯算法提高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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复