大数乘法
来源:互联网 发布:人不知而不愠的知 编辑:程序博客网 时间:2024/04/29 13:48
大数乘法
Sample Input
111111111111
222222222222
Sample Output
24691358024641975308642
1
#include<stdio.h>#include<string.h>int main(){ int f; int i,j,an,bn,k,d; char a[1000],b[1000]; int af[1000]= {0},bf[1000]= {0},c[1000]= {0}; while(scanf("%s%s",a,b)!=EOF) { an=strlen(a); bn=strlen(b); k=an>bn?an:bn; c[0]=0; f=0; for(i=0; i<an; i++) af[i]=a[an-i-1]-'0'; for(i=0; i<bn; i++) bf[i]=b[bn-i-1]-'0'; for(j=0; j<bn; j++) { for(i=0; i<an; i++) { d=c[i+j]; c[i+j]=(d+bf[j]*af[i])%10; c[i+1+j]+=(d+bf[j]*af[i])/10; } } for(i=an+bn; i>=0; i--) { if(c[i]) f=1; if(f || i==0) printf("%d",c[i]); } printf("\n"); for(i=0; i<2*k; i++) c[i]=af[i]=bf[i]=0; }}
2
#include <stdio.h>#include <string.h>#define MAX_LEN 200unsigned an1[MAX_LEN+10];unsigned an2[MAX_LEN+10];unsigned aResult[MAX_LEN * 2 + 10];char szLine1[MAX_LEN+10];char szLine2[MAX_LEN+10];int main(){ gets( szLine1); //gets函数读取一行 gets( szLine2); int i, j; int nLen1 = strlen( szLine1); memset( an1, 0, sizeof(an1)); memset( an2, 0, sizeof(an2)); memset( aResult, 0, sizeof(aResult)); j = 0; for( i = nLen1 - 1;i >= 0 ; i --) an1[j++] = szLine1[i] - '0'; int nLen2 = strlen(szLine2); j = 0; for( i = nLen2 - 1;i >= 0 ; i --) an2[j++] = szLine2[i] - '0'; //每一轮都用an2的一位,去和an1各位相乘,从an1的个位开始 for( i = 0;i < nLen2; i ++ ) { //用选定的an2的那一位,去乘an1的各位 for( j = 0; j < nLen1; j ++ ) //两数第i, j位相乘,累加到结果的第i+j位 aResult[i+j] += an2[i]*an1[j]; } //下面的循环统一处理进位问题 int nHighestPos = 0; for( i = 0; i < MAX_LEN * 2; i ++ ) { if( aResult[i] >= 10 ) { aResult[i+1] += aResult[i] / 10; aResult[i] %= 10; } if( aResult[i] ) nHighestPos = i; } for( i = nHighestPos; i >= 0; i -- ) printf("%d", aResult[i]); return 0;}
1 0