题目描述
输入两个十进制整数A,B。 A的位数至少为10,至多为100。B为一个一位数。计算他们的乘积,结果保留所有位数。 注意会有负数。注意将输入的数据当成一个字符串来处理。
输入格式
输入数据共两行,第一行,一个十进制整数,表示被乘数A。 第二行,一个一位十进制整数,表示乘数B。
基于上一次计算两个整除的商,并且精确至小数点后五十位的练习,我开始明白计算机的很多计算,无非是对我们人为计算的一种模拟。
那么同样的多位数乘法,我们是怎样计算的呢?
这里为了和代码一致,假设输入n位多位数乘数,我们把最末尾看为0位,最高位看作(n-1)位。
无非是从最末尾开始做99乘法后,保留个位数,十位数上的数作为进位。往前的位数也依旧是做99乘法,与之前不同的是要加上之前的进位。
不过这里要注意的是虽然先算的末尾,但这是我们最后要输出的数值,所以这里还需要有个逆向输出的流程,所以该题灵活运用数组就显得尤为重要。
还有一点是要考虑正负问题,a的正负尚可轻松解决,关键的是多位数如果出现负数怎么办,还好有了数组,我们直接跳过第一位,从后一位开始运算,注意由于有了强转,此时的“-”,实际是-3(ascll码-48)。
#include <stdio.h>
int main()
{
int sum[101];
int fac[101];
int i=0,j=0,e=0,a,n,x,y;
char c;
while((c=getchar())!='\n')
{
fac[i]=(int)(c-48);
i++;
}
n=i-1;
scanf("%d",&a);
if((fac[0]==-3)&&(a>0))
{printf("-");n--;}
if((fac[0]!=-3)&&(a<0))
{ a=-a;printf("-");}
if((fac[0]==-3)&&(a<0))
{a=-a;n--;}
for(x=0;x<=n;x++)
{
sum[x]=(fac[i-1]*a+e)%10;
e=(fac[i-1]*a+e)/10;
i--;
}
if(e!=0)printf("%d",e);
for(y=n;y>=0;y--)
{
printf("%d",sum[y]);
}
return 0;
}