2 条题解
-
4
AC代码(逆置)
#include <bits/stdc++.h> using namespace std; const int N=10010; const int M=2*N; int c[M],a[N],b[N]; char s1[N],s2[N]; int alen,blen,tmp; int main() { cin>>s1+1>>s2+1; int len1=strlen(s1+1); int len2=strlen(s2+1); for(int i=len1;i>=1;i--,tmp*=10) if((len1-i)%4==0) a[++alen]=s1[i]-'0',tmp=1; else a[alen]=(s1[i]-'0')*tmp+a[alen]; for(int i=len2;i>=1;i--,tmp*=10) if((len2-i)%4==0) b[++blen]=s2[i]-'0',tmp=1; else b[blen]=(s2[i]-'0')*tmp+b[blen]; for(int i=1;i<=alen;i++) for(int j=1;j<=blen;j++){ c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10000;//除10000,不是除1000!!!错了好久 c[i+j-1]%=10000; } int len=alen+blen-1; if(c[len+1]!=0) len++; for(int i=1;i<=len;i++) if(i!=1) printf("%04d",c[len-i+1]);//重点!当遍历到非最高四位时,要保证输出4位,不足4位前面补零 else cout<<c[len];//最高四位,直接输出,不带0 return 0; }
-
-1
#include <bits/stdc++.h> using namespace std; const int maxn=500;//由于两个数相乘,结果肯定不是240位,定义500绰绰有余 char sa[maxn],sb[maxn]; int a[maxn],b[maxn]; int c[maxn]; int main(){ cin>>sa; cin>>sb; int la=strlen(sa); int lb=strlen(sb); memset(c,0,sizeof(c)); for (int i=0;i<la;i++){ a[la-i]=sa[i]-'0'; } for (int i=0;i<lb;i++){ b[lb-i]=sb[i]-'0'; }//倒序 for (int i=1;i<=la;i++){ for (int j=1;j<=lb;j++){ c[i+j-1]+=a[i]*b[j]; }//计算数值 } int lc=la+lb; for (int i=1;i<=lc;i++){ c[i+1]+=c[i]/10; c[i]%=10; }//计算进位 while(c[lc]==0&&lc>1){//由于任何数*0的结果都是0,如果没有判断,啥都没输出,所以要保留一位 lc--; }//去除前导0 for (int i=lc;i>=1;i--){ cout<<c[i]; }//倒序输出 return 0; }
- 1
信息
- ID
- 283
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 6
- 标签
- 递交数
- 187
- 已通过
- 61
- 上传者