模拟乘法,注意格式,在HDU,G++提交用__int64 在SOJ用long long型提交,这个把我坑了,格式也很坑。
#include <iostream>
#include<cstdio>
typedef __int64 LL;
using namespace std;
int get_digit(LL n)
{
int k=0;
if(n==0) return 1;
while(n){
n/=10;
k++;
}
return k;
}
void print(LL n,int k)
{
for(int i=0;i<k;i++) printf(" ");
printf("%I64d",n);
}
bool Multi(LL x,LL y,int n,int n2)
{
int D=0,D1=0,g,k;
LL ans;
while(y){
D++;
g=y%10;
y=y/10;
while(g==0){
D1++;
D++;
g=y%10;
y=y/10;
}
if(D1==n2-1) return 1;
ans=x*g;
k=get_digit(ans);
if(ans>0){
print(ans,n-k-D+1);
for(int i=0;i<D1;i++) printf("0");
D1=0;
puts("");
}
}
return 0;
}
int main()
{
int n1,n2,m;
LL s,t;
LL ans;
int T=1;
while(scanf("%I64d %I64d",&s,&t),s||t){
n1=get_digit(s),n2=get_digit(t);
ans=s*t;
m=get_digit(ans);
printf("Problem %d\n",T++);
print(s,m-n1);puts("");
print(t,m-n2);puts("");
for(int i=0;i<m;i++){
printf("-");
}
puts("");
if(t==0){
puts("0");
continue;
}
else if(n2>1){
if(!Multi(s,t,m,n2)){
for(int i=0;i<m;i++) printf("-");
puts("");
}
}
printf("%I64d\n",ans);
}
return 0;
}