首页 > 代码库 > POJ.grids.2980

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 500int 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");    }}

  

 

POJ.grids.2980