题目描述
输入两个十进制整数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; }