- 高精度乘法
- 2019-08-01 17:16:56 @
我也不知道为什么会运行错误啊!各位牛哥救救我!!
代码如下;
```cpp
/*
* VIJOS-1040 高精度乘法
* mike-w
* 2012-10-21
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXL 10000
#define BASE 10000
#define WIDTH 4
int a[MAXL], b[MAXL], c[MAXL];
char buf[MAXL];
int read(int s)
{
scanf("%s", buf);
int len=strlen(buf);
int w=1, sum=0, p=MAXL-1;
int i;
for(i=len-1; i>=0; i--)
{
sum+=w(buf[i]-'0');
w*=10;
if(w==BASE)
{
s[p--]=sum;
sum=0;
w=1;
}
}
if(sum)
s[p--]=sum;
return 0;
}
int disp(int *s)
{
int i;
for(i=0; i<MAXL-1; i++)
if(s[i])
break;
printf("%d", s[i++]);
for(; i<MAXL; i++)
printf("%0*d", WIDTH, s[i]);
return 0;
}
int multi(int *s1, int *s2, int *ans)
{
int i, j, c;
for(i=1, c=0; i<=MAXL; i++)
for(j=1; j<=MAXL; j++)
{
ans[MAXL+1-i-j]+=s1[MAXL-i]*s2[MAXL-j]+c;
c=ans[MAXL+1-i-j]/BASE;
if(c)
ans[MAXL+1-i-j]%=BASE;
}
return 0;
}
int main(void)
{
read(a);
read(b);
multi(a, b, c);
disp(c);
putchar('\n');
return 0;
}
```
1 条评论
-
eofitj LV 6 @ 2020-12-19 21:08:34
我死在50分上了
#include<bits/stdc++.h> #define N 100001 using namespace std; int a[501],b[501],c[501]; char a1[501],b1[501]; void convert(char s[],int a[]) { reverse(s,s+strlen(s)); for(int i=0;i<strlen(s);i++)a[i]=s[i]-48; } int cheng(int a[],int b[],int lena,int lenb) { int x=0,i,j; for(i=0;i<lenb;i++) { x=0; for(j=0;j<lena;j++) { c[i+j]=c[i+j]+a[j]*b[i]+x; x=c[i+j]/10; c[i+j]=c[i+j]%10; } c[i+j]=x; } if(x) { c[i+j-1]=x; return i+j-1; } else return i+j-2; } void print(int a[],int len) { while(a[len]==0)len--; if(len<0) cout<<0; else for(int i=len;i>=0;i--)cout<<a[i]; } int main() { int i,j,k,len,w; cin>>a1; cin>>b1; convert(a1,a); convert(b1,b); len=cheng(a,b,strlen(a1),strlen(b1)); print(c,len); return 0; }
#include <iostream> using namespace std; const int N=201; string s1,s2; int a1[N],a2[2*N],a3[N],a4[N],i,j,k,t; int main() { cin>>s1>>s2; int l1=s1.size(),l2=s2.size(); for(i=0;i<l1;i++)a3[l1-i-1]=s1[i]-'0'; for(i=0;i<l2;i++)a4[l2-i-1]=s2[i]-'0'; for(i=0;i<l2;i++){ for(j=0,k=i;j<l1;j++){ t=a1[k+j]+a3[j]*a4[i]; a1[k+j]=t%10; a1[k+j+1]=t/10; } for(k=i;k<=i+l1;k++){ t=a2[k]+a1[k]; a2[k]=t%10; a2[k+1]+=t/10; a1[k]=0; } } for(k=l1+l2-1;a2[k]==0&&k>=0;k--); if(k<0)cout<<0; while(k>=0) cout<<a2[k--]; return 0; }
#include<bits/stdc++.h> using namespace std; char s[500]; int a[500], b[500], c[5000]; void read(int bn[]) { scanf("%s", s); int len = strlen(s); bn[0] = len; for (int i = 1; i <= len; i++) bn[i] = s[len-i] - '0'; } void mul(int a[], int b[], int c[]) { c[0] = a[0] + b[0] - 1; for (int i = 1; i <= a[0]; i++) for (int j = 1; j <= b[0]; j++) { c[i+j-1] += a[i] * b[j]; c[i+j] += c[i+j-1] / 10; c[i+j-1] %= 10; } if (c[c[0] + 1]) c[0]++; } int main() { read(a); read(b); mul(a, b, c); while(c[c[0]] == 0 && c[0] > 1) c[0]--; for(int i = c[0]; i > 0; i--) printf("%d", c[i]); return 0; }
- 1