大数乘法
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 200
unsigned 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;
}