POJ.grids.2980
题目链接:http://bailian.openjudge.cn/practice/2980
解题思路:先将对应位相乘的积累加,最后再来处理进位问题;如 835*49;
先做 835*9;
得到 i 2 1 0
72 27 45
再做 835*4
得到 i 3 2 1 0
32 12 20 0
再把对应位上的累加起来
得到 i 3 2 1 0
3 2 84 47 45
最后再考虑进位的问题
得到 i 4 3 2 1 0
4 0 9 1 5
这样就得到了835*49;
注意:一个数的第i位和另一个数的第j位相乘所得的数,一定要放在积的第i+j位上;
两个长度都为len的数相乘所得的积的位数不会超过2*len;
反思:还是不够熟练,好好学,改了好多次。
#include<stdio.h>
#include<string.h>
#define max 500
int main()
{
int i,j;
int len1,len2,len;
int a[max],b[max],c[max];
char str1[max],str2[max];
while(~scanf("%s %s",&str1,&str2))
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
len1=strlen(str1);
len2=strlen(str2);
for(i=0;i<len1;i++)
{
a[i]=str1[len1-i-1]-'0';
}
for(i=0;i<len2;i++)
{
b[i]=str2[len2-i-1]-'0';
}
for(i=0;i<len2;i++)
{
for(j=0;j<len1;j++)
c[i+j]+=b[i]*a[j];
}
len=i+j;
for(i=0;i<len;i++)
{
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
for(i=len;(c[i]==0)&&(i>=0);i--);
for(j=i;j>=0;j--)
printf("%d",c[j]);
printf("\n");
}
}

浙公网安备 33010602011771号