1018: 算法提高 乘法运算
时间限制: 1 Sec 内存限制: 512 MB提交: 10 解决: 2
题目描述
编制一个乘法运算的程序。
从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出。
输入
输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99)。
输出
输出为4行或7行,符合乘法的竖式运算格式。
样例输入
89 13
样例输出
89
×13
━━━
267
89
━━━
1157
提示
3×89=267,则第四行267右侧对准个位输出。1×89=89,则第五行89右侧对准十位输出。267+890=1157,则1157右侧对准个位输出。
解题思路:
按照题目意思就是输入两个不大于100的整数,输出他们的乘法竖式。我们知道乘法竖式要么是4行,要么是7行。
由于这是一道蓝桥杯比赛题目,放到了自家的服务器上,结果自家人在后台只给了输入,输出里面什么都没有,于是我按照自己思路做了一下,给后台添了输出数据。
后台测试数据如下:
Sample.in
89 13
Sample.out
89
×13
━━━
267
89
━━━
1157
1.in
15 8
1.out
15
×8
━━━
120
2.in
25 40
2.out
25
×40
━━━
00
100
━━━
1000
3.in
99 91
3.out
99
×91
━━━
99
891
━━━
9009
4.in
99 99
4.out
99
×99
━━━
891
891
━━━
9801
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
char m[3],n[3];
int a[4],b[3],i,j;
while(~scanf("%s%s",m,n))
{
printf("%s\n",m);
printf("×%s\n",n);
printf("━━━\n");
int t1=0,t2=0;
for(i = 0; i < strlen(m); i++)
t1 = t1*10 + m[i]-'0';
for(i = 0; i < strlen(n); i++)
t2 = t2*10 + n[i]-'0';
///现在t1,t2是整数形式的m,n
if(t2<10)
printf("%d\n",t1*t2);
else
{
for(i = 0; i < 4; i++)
a[i] = -1;
for(i = 0; i < 3; i++)
b[i] = -1;
int c1 = 3;
int c2 = 2;
int k1 = 0;///进位初始化为0
int k2 = 0;
for(j=strlen(m)-1;j>=0;j--)
{
int temp1 = (m[j]-'0')*(n[1]-'0')+k1;
int temp2 = (m[j]-'0')*(n[0]-'0')+k2;
if(temp1>9)
k1 = temp1/10; ///进位
else
k1 = 0;
if(temp2>9)
k2 = temp2/10;
else
k2 = 0;
a[c1]=temp1%10;
c1--;
b[c2]=temp2%10;
c2--;
}
if(k1!=0)
a[c1]=k1;
if(k2!=0)
b[c2]=k2;
for(i = 0; i < 3; i++)
if(b[i]!=-1)
break;
j = i;
for(;i<4;i++)
if(a[i]!=-1)
break;
else
printf(" ");
for(;i<4;i++)
printf("%d",a[i]);
printf("\n");
for(;j<3;j++)
printf("%d",b[j]);
printf("\n");
printf("━━━\n");
printf("%d\n",t1*t2);
}
}
return 0;
}