//程序实现两个任意长度数字相乘
#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;
}
测试:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
图片附件: 游客没有浏览图片的权限,请
登录 或
注册