Legendre @ 2020-02-03 16:23:50
#include <iostream>
using namespace std;
string sa,sb;
int la,lb,lc;
int a[1001],b[1001],c[1001];
void printsz(int x[]){
for (int i=x[0]; i>=1; i--) cout<<x[i];
cout<<endl;
}
int main()
{
cin>>sa>>sb;
la=sa.length();
lb=sb.length();
for (int i=0; i<la; i++) a[la-i]=sa[i]-'0';
a[0]=la;
for (int i=0; i<lb; i++) b[lb-i]=sb[i]-'0';
b[0]=lb;
lc=la+lb;
for (int i=1; i<=la; i++)
for (int j=1; j<=lb; j++)
c[i+j-1]+=a[i]*b[j];
int t,jw=0;
for (int i=1; i<=lc; i++){
t=c[i]+jw;
c[i]=t%10;
jw=t/10;
}
while (c[lc]==0 && lc>1) lc--;
c[0]=lc;
printsz(c);
return 0;
}
蒟蒻写的高精,#5 哇了
求助各位大佬
毕竟我本来就讨厌写高精。。。
by 旭日临窗 @ 2020-07-15 12:27:15
@lelele @lelele 你存进a和b的时候是不是有点问题, la - i还要减去1啊,
然后你做乘法的时候可以从0开始啊<=改成<, c[i + j]就行了
进位的时候还有一种方法:
for(int i = 0;i <= la + lb - 2;i++){
if(c[i] >= 10){
c[i + 1] = c[i + 1] + c[i] / 10;
c[i] = c[i] % 10;
}
}
lc也有点问题,可以改成:
if(c[la + lb - 1] != 0){
lc = la + lb;
}
else{
lc = la + lb - 1;
}
你可以看一下我的代码:
#include <bits/stdc++.h>
using namespace std;
char a[3000],b[3000];
int c[3000],d[3000];
int h[6010];
int main(){
cin >> a >> b;
int s,s2,k;
s = strlen(a);
s2 = strlen(b);
if(s == 1 && a[0] - '0' == 0 || s2 == 1 && b[0] - '0' == 0){
cout << 0;
return 0;
}
for(int i = 0;i < s;i++){
c[s - 1 - i] = (a[i] - '0');
}
for(int i = 0;i < s2;i++){
d[s2 - 1 - i] = (b[i] - '0');
}
for(int i = 0;i < s;i++){
for(int j = 0;j < s2;j++){
h[i + j] += c[i] * d[j];
}
}
for(int i = 0;i <= s + s2 - 2;i++){
if(h[i] >= 10){
h[i + 1] = h[i + 1] + h[i] / 10;
h[i] = h[i] % 10;
}
}
if(h[s + s2 - 1] != 0){
k = s + s2;
}
else{
k = s + s2 - 1;
}
for(int i = k - 1;i >= 0;i--){
cout << h[i];
}
return 0;
}
这样就应该没问题了
by 旭日临窗 @ 2020-07-15 12:30:36
@lelele 还有最后一个问题 你数组好像开的不够,题目要求2000位,你只有1000位