#include<stdio.h>
#include<string.h>
int multi(char s1[],char s2[],int a[]);
int main()
{
int i,m,x[1001];
char s1[1001],s2[1001];
gets(s1);
gets(s2);
m=multi(s1,s2,x);
for(i=m;i>=0;i--)
printf("%d",x[i]);
printf("\n");
return 0;
}
int multi(char s1[],char s2[],int a[])
{
long b,d;
int i,i1,i2,j,k,n,n1,n2;
for(i=0;i<255;i++)
a[i]=0;
n1=strlen(s1);
n2=strlen(s2);
d=0;
for(i1=0,k=n1-1;i1<n1;i1++,k--)
{
for(i2=0,j=n2-1;i2<n2;i2++,j--)
{
i=i1+i2;
b=a[i]+(s1[k]-48)*(s2[j]-48)+d;
a[i]=b%10;
d=b/10;
}
while(d>0){
i++;
a[i]+=d%10;
d/=10;
}
n=i;
}
return n;
}
代码里的数字最好用宏和常量代替,便于理解和阅读。
定义宏N为100,表示一百位以内数。用N定义两个字符数组(包括结尾的'\0')。两个100位以内的数乘积的结果不超过200位,所以x数组的大小为2*N。
48用'0'
代替,s1[k]-'0'
表示将字符数字s1[k]
转化为相应的数字,比如字符'9'
转化为数字9
#include <stdio.h>
#include <string.h>
#define N 100
int multi(char s1[], char s2[], int a[]);
int main()
{
int i, m, x[2 * N];
char s1[N], s2[N];
scanf("%s", s1);
scanf("%s", s2);
m = multi(s1, s2, x);
for (i = m; i >= 0; i--)
printf("%d", x[i]);
printf("\n");
return 0;
}
int multi(char s1[], char s2[], int a[])
{
long b, d;
int i, i1, i2, j, k, n, n1, n2;
for (i = 0; i < 2 * N; i++)
a[i] = 0;
n1 = strlen(s1);
n2 = strlen(s2);
d = 0;
for (i1 = 0, k = n1 - 1; i1 < n1; i1++, k--)
{
for (i2 = 0, j = n2 - 1; i2 < n2; i2++, j--)
{
i = i1 + i2;
b = a[i] + (s1[k] - '0') * (s2[j] - '0') + d;
a[i] = b % 10;
d = b / 10;
}
while (d > 0)
{
i++;
a[i] += d % 10;
d /= 10;
}
n = i;
}
return n;
}
ascii为48的字符是'0',s1[k]-48则是把字符s1[k]转换成数字。
char s1[1001],s2[1001]; 是1000位,100改成
int i,m,x[201];
char s1[101],s2[101];
初始化修改
for(i=0;i<255;i++)
a[i]=0;
改成,需添加stdlib.h
memset(a,0,sizeof(int)*201);