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



    }



}

  

 

你可能感兴趣的:(grid)