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("
");

    }

}

  

原文地址:https://www.cnblogs.com/wuyuewoniu/p/4114660.html