首页 > 代码库 > 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