#include<bits/stdc++.h>usingnamespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))char a[10010];char b[10010];int aa[10010];int bb[10010];int cc[20010];intmain(){while(~scanf("%s %s", a, b)){int la =strlen(a);int lb =strlen(b);int l = la+lb;int k =0;for(int i = la-1; i >=0; i--) aa[k++]= a[i]-'0';
k =0;for(int i = lb-1; i >=0; i--) bb[k++]= b[i]-'0';mem(cc);for(int i =0; i < la; i++){for(int j =0; j < lb; j++){
cc[i+j]+= aa[i]*bb[j];}}int p =0;for(int i =0; i < l; i++){
cc[i]+= p;
p = cc[i]/10;if(cc[i]>=10){
cc[i]%=10;}}int q;for(int i = l; i >=0; i--){if(cc[i]!=0){
q = i;break;}if(i==0) q =0;}for(int i = q; i >=0; i--){printf("%d", cc[i]);}printf("\n");}return0;}
一开始根据上面那题模拟,两两相乘,结果T了,下面是T了的代码。
#include<bits/stdc++.h>usingnamespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))char a[10];char b[10];char d[10];int c[10];int aa[10];int bb[10];int cc[2000010];int r[2000010];int n;int kk;voidsum(int l1,int l2,int tt)// cc->l1 c->l2{/*
for(int i = l1-1; i >= 0; i--) cout << cc[i];
cout << endl;
for(int i = l2-1; i >= 0; i--) cout << c[i];
cout << endl;
*/mem(r);for(int i =0; i < l1; i++){for(int j =0; j < l2; j++){
r[i+j]+= cc[i]*c[j];}}int p =0;for(int i =0; i < l1+l2; i++){
r[i]+= p;
p = r[i]/10;if(r[i]>=10){
r[i]%=10;}}for(int i = l1+l2; i >=0; i--){if(r[i]!=0){
kk = i;break;}if(i==0) kk =0;}/*
for(int i = kk; i >= 0; i--){
printf("%d", r[i]);
}
printf("\n");
*/if(tt==n-1){for(int i = kk; i >=0; i--){printf("%d", r[i]);}printf("\n");}else{mem(cc);for(int i = kk; i >=0; i--){
cc[i]= r[i];}}}intmain(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);scanf(" %s %s", a, b);int la =strlen(a);int lb =strlen(b);int l = la+lb;
kk =0;for(int i = la-1; i >=0; i--) aa[kk++]= a[i]-'0';
kk =0;for(int i = lb-1; i >=0; i--) bb[kk++]= b[i]-'0';mem(r);for(int i =0; i < la; i++){for(int j =0; j < lb; j++){
r[i+j]+= aa[i]*bb[j];}}int p =0;for(int i =0; i < l; i++){
r[i]+= p;
p = r[i]/10;if(r[i]>=10){
r[i]%=10;}}for(int i = l; i >=0; i--){if(r[i]!=0){
kk = i;break;}if(i==0) kk =0;}if(n==2){for(int i = kk; i >=0; i--){printf("%d", r[i]);}printf("\n");}mem(cc);for(int i = kk; i >=0; i--){
cc[i]= r[i];}for(int i =2; i < n; i++){scanf("%s", d);int lc =strlen(d);mem(c);int q =0;for(int i = lc-1; i >=0; i--){
c[q++]= d[i]-'0';//cout << c[i];}//cout << endl;//cout << kk << " " << lc << endl;sum(kk+1,lc,i);}}return0;}
AC代码
#include<bits/stdc++.h>usingnamespace std;int num[10010];int sum[100010];intmain(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);int flag =0;for(int i =0; i < n; i++){scanf("%d",&num[i]);if(num[i]==0) flag =1;}if(flag==1){printf("0\n");continue;}else{memset(sum,1,sizeof(sum));for(int i =0; i <100000; i++) sum[i]=1;int l =1;int p =0;//进位for(int i =0; i < n; i++){for(int j =0; j < l; j++){int x = sum[j]*num[i]+p;
sum[j]= x%10;
p = x/10;}while(p>0){
sum[l++]= p%10;
p /=10;}}for(int i = l-1; i >=0; i--){printf("%d", sum[i]);}printf("\n");}}return0;}