请问这个代码中的255和48是从哪来的?如果我想改成两个一百位以内的数乘积怎么改?


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