//程序实现两个任意长度数字相乘
#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,nn,mm,i,j,t,k1,k2,n_1,n_2,temp,count,flag;
    char str1[1000];
    char str2[1000];
loop_1:
    printf("请输入第一个1000位以内的数字:");
    gets(str1);
    int N=strlen(str1);
    for(i=0,j=0,n=0,nn=0;i<N;i++)
    {
        if(str1[i]<'0'||str1[i]>'9')
        {
            printf("输入错误!请输入一串数字!\n");
            goto loop_1;
        }
        else
        if(str1[i]=='0')
        n++;
        else
        for(;j<1;j++)
        nn=n;
    }
loop_2:
    printf("请输入第二个1000位以内的数字:");
    gets(str2);
    int M=strlen(str2);
    for(i=0,j=0,m=0,mm=0;j<M;j++)
    {
        if(str2[j]<'0'||str2[j]>'9')
        {
            printf("输入错误!请输入一串数字!\n");
            goto loop_2;
        }
        else
        if(str2[j]=='0')
        m++;
        else
        for(;i<1;i++)
        mm=m;
    }
    if(nn==0&&str1[0]=='0')
    N=1;
    if(mm==0&&str2[0]=='0')
    M=1;
    if(N==1&&M==1)//一位数乘一位数单独列出
    {
        if(str1[0]<str2[0])
        temp=str1[0],str1[0]=str2[0],str2[0]=temp;
        printf("两数相乘过程如下:\n");
        printf("
  %c\n",str1[0]);
        printf("* %c\n",str2[0]);
        printf("---\n");
        n_2=(str1[0]-48)*(str2[0]-48);
        if(n_2<10)
        printf("
  %d\n",n_2);
        else
        printf(" %d\n",n_2);
        return 0;
    }
    N=N-nn;
    M=M-mm;
    char num_1[N+M];//第一个数(数组后半段)
    char num_2[N+M];//第二个数(数组后半段)
    char num_3[M][N+M];//保存中间数
    int num_4[N+M];//保存结果
    memset(num_1,' ',sizeof(num_1));//初始化各数组
    memset(num_2,' ',sizeof(num_2));
    memset(num_3,' ',sizeof(num_3));
    memset(num_4,0,sizeof(num_4));
    if(N<M)//第一串比第二串短
    {
        temp=N;//交换后,N为长数的位数,M为短数的位数
        N=M;
        M=temp;
        for(i=M;i<N+M;i++)//给第一个数赋值较长串
        num_1[i]=str2[i-M+mm];
        for(i=N;i<N+M;i++)//给第二个数赋值较短串
        num_2[i]=str1[i-N+nn];
    }
    else//第一串比第二串长
    {
        for(i=M;i<N+M;i++)//给第一个数赋值较长串
        num_1[i]=str1[i-M+nn];
        for(i=N;i<N+M;i++)//给第二个数赋值较短串
        num_2[i]=str2[i-N+mm];
    }
    num_2[N-2]='*';//确定'*'的位置
    printf("两数相乘过程如下:\n");
    for(i=0;i<N+M;i++)//打印第一个数
    printf("%c",num_1[i]);
    printf("\n");
    for(i=0;i<N+M;i++)//打印'*'和第二个数
    printf("%c",num_2[i]);
    printf("\n");
    for(i=0;i<N+M;i++)//打印下划线
    printf("-");
    printf("\n");
    num_1[M-1]='0';//用于最后一位进位计算
    for(i=0;i<M;i++)//开始相乘
    for(j=0,flag=0;j<N+1;j++)//第二个数的每位(由低位向高位)与第一个数相乘
    {
        n_1=(num_2[N+M-1-i]-48)*(num_1[N+M-1-j]-48)+flag;//每位分别相乘并进位
        if(j==N&&flag==0)
        num_3[i][N+M-1-i-j]=' ';//防止首位打印0
        else
        num_3[i][N+M-1-i-j]=n_1%10+48;//向二维数组中保存计算过程
        flag=n_1/10;//获取进位标志
    }
    for(i=0,flag=0;i<N+M;i++)
    {
        for(j=0;j<M;j++)
        if(num_3[j][N+M-1-i]!=' ')
        num_4[N+M-1-i]+=num_3[j][N+M-1-i]-48;//列元素相加
        num_4[N+M-1-i]+=flag;
        flag=num_4[N+M-1-i]/10;//获取进位标志
        if(i==N+M-1&&num_4[N+M-1-i]==0)
        num_4[N+M-1-i]=' ';//防止首位打印0
        else
        num_4[N+M-1-i]%=10;//保存结果
    }
    for(i=N,k2=0;i<N+M;i++)//计算第二个数非0的个数
    if(num_2[i]!='0')
    k2++;
    if(k2!=1)//只有一行则不打印,超过一行才打印
    for(i=0,flag=0;i<M;i++)//打印计算过程
    {
        for(j=0;j<N+M;j++)
        if(num_3[i][j]!='0'&&num_3[i][j]!=' ')//一旦发现此行有数字则跳出循环
        {
            flag=1;
            break;
        }
        if(flag==1)
        {
            for(j=0;j<N+M;j++)//打印有数字的行
            printf("%c",num_3[i][j]);
            printf("\n");
            flag=0;//标志还原
        }
    }
    if(k2!=1&&k2!=0)//超过两行才打印下划线
    {
        for(i=0;i<N+M;i++)
        printf("-");
        printf("\n");
    }
    if(k2!=0)//有非0的数字则打印结果
    for(i=0;i<N+M;i++)//打印结果
    {
        if(i==0&&num_4[i]==' ')
        printf(" ");//防止首位打印0
        else
        printf("%d",num_4[i]);
    }
    else//全是0则打印一个0
    {
        for(i=0;i<N+M-1;i++)
        printf(" ");
        printf("0");
    }
    printf("\n\n");
    return 0;
}
测试:
	
		
			
        
				
				
					
						图片附件: 游客没有浏览图片的权限,请 
登录 或 
注册 
		
	
	
		
			
        
				
				
					
						图片附件: 游客没有浏览图片的权限,请 
登录 或 
注册