题目标题 grade school multiplication
题目大意 用乘法的竖式来表示乘法
题目链接 http://210.44.14.31/problem/show/1153
这个题就是用高精度乘法来做,需要完全理解了高精度乘法的意思,然后把每一步都记下来,最后再用题目所给的格式输出
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char a[200],b[200];
int main()
{
int sign=0;
while(cin>>a>>b){
sign++;
char c[200];
int d[200][200]={0};
if(a[0]=='0' && b[0]=='0' && strlen(a)==1 && strlen(b)==1) break;
int m=strlen(a)+strlen(b)-1;
int aa[200]={0},bb[200]={0},re[200]={0};
for(int i=0;i<strlen(a);i++){
aa[i]=a[strlen(a)-i-1]-'0';
}
for(int i=0;i<strlen(b);i++){
bb[i]=b[strlen(b)-i-1]-'0';
}
for(int i=0;i<strlen(b);i++){
for(int j=0;j<strlen(a);j++){
d[i][i+j]=aa[j]*bb[i];
re[i+j]+=aa[j]*bb[i];
}
for(int j=i;j<strlen(a)+i;j++){
if(d[i][j]>=10) {
d[i][j+1]+=d[i][j]/10;
d[i][j]=d[i][j]%10;
}
}
}
for(int i=0;i<m;i++){
if(re[i]>=10) {
re[i+1]+=re[i]/10;
re[i]=re[i]%10;
}
}
if(re[m]!=0) m++;
for(int i=m-1;i>=0;i--) c[m-1-i]=(char)(re[i]+'0');
c[m]='\0';
cout<<"Problem "<<sign<<endl;
for(int i=0;i<m-strlen(a);i++) cout<<' ';
for(int i=0;i<strlen(a);i++) cout<<a[i];
cout<<endl;
for(int i=0;i<m-strlen(b);i++) cout<<' ';
for(int i=0;i<strlen(b);i++) cout<<b[i];
cout<<endl;
for(int i=0;i<m;i++) cout<<'-';
cout<<endl;
int lei=0,lei2=0;
for(int i=0;i<strlen(b);i++){
int iiii=0;
for(int j=0;j<m;j++){
if(d[i][j]!=0) {
iiii=1;
}
}
if(iiii==0) lei++;
if(iiii==1){
lei2++;
for(int j=m-1;j>=i;j--){
if(d[i][j]==0&&iiii==1) cout<<' ';
if(d[i][j]!=0||iiii==2){
cout<<d[i][j];
iiii=2;
}
}
for(int j=0;j<lei;j++) cout<<'0';
lei=0;
cout<<endl;
}
}
if(lei2>1){
for(int i=0;i<m;i++) cout<<'-';
cout<<endl;
for(int i=0;i<m;i++) cout<<c[i];
cout<<endl;
}
}
return 0;
}