帮女朋友做的课程设计,一直希望自己能做出一个有关大数的程序,所以看到这个课题就直接选了,也当作锻炼自己
大数的加减乘除运算,除法运算的小数部分是将余数乘以1000000之后再进行一次除法运算
下面是我的程序
#include<stdio.h>
#include<string.h>
#define M 200
void sub(char s1[],char s2[],int len2)//在除法函数里面会用到
{
int i=0;
int j;
while(1)
{
if(s1[i]=='0')
i++;
else
{
j=i;
break;
}
}
for(;i<len2;i++)
s1[i]=s1[i]-s2[i]+'0';
for(i=len2-1;i>j;i--)//从低位开始检测是否小于零
{
if(s1[i]<'0')
{
s1[i]+=10;
s1[i-1]--;
}
}
}
void chufa(char s1[],char s2[],int x)
{
int jieguo[M],i,p=0;
memset(jieguo,0,sizeof(jieguo));
int len1,len2,len3;
len1=strlen(s1);
len2=strlen(s2);
if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0)&&x!=0)//如果a<b,直接输出0
{printf("0");goto END;}
while(1)
{
while(strncmp(s1,s2,len2)>=0)//一直进行减法,直到不能减为止
{
sub(s1,s2,len2);
jieguo[p]++;
}
p++;
if(len1==len2)
break;
for(i=len2-1;i>=0;i--)
s2[i+1]=s2[i];
s2[0]='0';
len2++;
s2[len2]='\0';
}
i=1-x;
if(x==1)
while(1)
{
if(jieguo[i]==0)
i++;
else
break;
}
for(;i<p;i++)
printf("%d",jieguo[i]);
END:if(x!=0)printf(".");
len3=strlen(s1);
for(i=6;i>=0;i--)
s1[len3++]='0';
s1[len3]='\0';
if(x==1)chufa(s1,s2,0);
}
void menu()
{
printf("*********************************************************************\n");
printf("请选择你需要进行的操作\n");
printf("1.大数加法 2.大数减法\n");
printf("3.大数乘法 4.大数除法\n");
printf("---------------------------------------------------------------------\n");
}
void add(char s1[],char s2[])//加法函数
{
int num1[M]={0},num2[M]={0};
int i,j,len1,len2;
len1=strlen(s1);
len2=strlen(s2);
for(i=len1-1,j=0;i>=0;i--)//num1[0]保存的是低位
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0';
for(i=0;i<M;i++)
{
num1[i]+=num2[i];
if(num1[i]>9)
{
num1[i]-=10;
num1[i+1]++;
}
}
for(i=M-1;(i>=0)&&(num1[i]==0);i--);//找到第一个不是0的数的位置
if(i>=0)//从高位到低位输出每个数
for(;i>=0;i--)
printf("%d",num1[i]);
else
printf("0\n");
}
void jian(char s1[],char s2[])//减法函数
{
int num1[M],num2[M];
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int n,i,j,len1,len2;
len1=strlen(s1);
len2=strlen(s2);
n=strcmp(s1,s2);
if(len1<len2||(len1==len2&&n<0)){printf("-");jian(s2,s1);}
for(i=len1-1,j=0;i>=0;i--)//num1[0]保存的是低位
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0';
for(i=0;i<M;i++)
{
num1[i]-=num2[i];
if(num1[i+1]>0&&num1[i]<0)
{
num1[i]=num1[i]+10;
--num1[i+1];
}
}
for(i=M-1;(i>=0)&&(num1[i]==0);i--);//找到第一个不是0的数的位置
if(i>=0)//从高位到低位输出每个数
for(;i>=0;i--)
printf("%d",num1[i]);
else
printf("0\n");
}
void multi(char str1[],char str2[])//乘法函数
{
int len1,len2,i,j;
int a[M+10],b[M+10],c[M*2+10];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
len1=strlen(str1);
for(j=0,i=len1-1;i>=0;i--)//把数字倒过来
a[j++]=str1[i]-'0';
len2=strlen(str2);
for(j=0,i=len2-1;i>=0;i--)//倒转第二个整数
b[j++]=str2[i]-'0';
for(i=0;i<len2;i++)//用第二个数乘以第一个数,每次一位
for(j=0;j<len1;j++)
c[i+j]+=b[i]*a[j];//先乘起来,后面统一进位
for(i=0;i<M*2;i++)//循环统一处理进位问题
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
for(i=M*2;(c[i]==0)&&(i>=0);i--);//跳过高位的0
if(i>=0)
for(;i>=0;i--)
printf("%d",c[i]);
else
printf("0");
printf("\n");
}
#include<string.h>
#define M 200
void sub(char s1[],char s2[],int len2)//在除法函数里面会用到
{
int i=0;
int j;
while(1)
{
if(s1[i]=='0')
i++;
else
{
j=i;
break;
}
}
for(;i<len2;i++)
s1[i]=s1[i]-s2[i]+'0';
for(i=len2-1;i>j;i--)//从低位开始检测是否小于零
{
if(s1[i]<'0')
{
s1[i]+=10;
s1[i-1]--;
}
}
}
void chufa(char s1[],char s2[],int x)
{
int jieguo[M],i,p=0;
memset(jieguo,0,sizeof(jieguo));
int len1,len2,len3;
len1=strlen(s1);
len2=strlen(s2);
if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0)&&x!=0)//如果a<b,直接输出0
{printf("0");goto END;}
while(1)
{
while(strncmp(s1,s2,len2)>=0)//一直进行减法,直到不能减为止
{
sub(s1,s2,len2);
jieguo[p]++;
}
p++;
if(len1==len2)
break;
for(i=len2-1;i>=0;i--)
s2[i+1]=s2[i];
s2[0]='0';
len2++;
s2[len2]='\0';
}
i=1-x;
if(x==1)
while(1)
{
if(jieguo[i]==0)
i++;
else
break;
}
for(;i<p;i++)
printf("%d",jieguo[i]);
END:if(x!=0)printf(".");
len3=strlen(s1);
for(i=6;i>=0;i--)
s1[len3++]='0';
s1[len3]='\0';
if(x==1)chufa(s1,s2,0);
}
void menu()
{
printf("*********************************************************************\n");
printf("请选择你需要进行的操作\n");
printf("1.大数加法 2.大数减法\n");
printf("3.大数乘法 4.大数除法\n");
printf("---------------------------------------------------------------------\n");
}
void add(char s1[],char s2[])//加法函数
{
int num1[M]={0},num2[M]={0};
int i,j,len1,len2;
len1=strlen(s1);
len2=strlen(s2);
for(i=len1-1,j=0;i>=0;i--)//num1[0]保存的是低位
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0';
for(i=0;i<M;i++)
{
num1[i]+=num2[i];
if(num1[i]>9)
{
num1[i]-=10;
num1[i+1]++;
}
}
for(i=M-1;(i>=0)&&(num1[i]==0);i--);//找到第一个不是0的数的位置
if(i>=0)//从高位到低位输出每个数
for(;i>=0;i--)
printf("%d",num1[i]);
else
printf("0\n");
}
void jian(char s1[],char s2[])//减法函数
{
int num1[M],num2[M];
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int n,i,j,len1,len2;
len1=strlen(s1);
len2=strlen(s2);
n=strcmp(s1,s2);
if(len1<len2||(len1==len2&&n<0)){printf("-");jian(s2,s1);}
for(i=len1-1,j=0;i>=0;i--)//num1[0]保存的是低位
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0';
for(i=0;i<M;i++)
{
num1[i]-=num2[i];
if(num1[i+1]>0&&num1[i]<0)
{
num1[i]=num1[i]+10;
--num1[i+1];
}
}
for(i=M-1;(i>=0)&&(num1[i]==0);i--);//找到第一个不是0的数的位置
if(i>=0)//从高位到低位输出每个数
for(;i>=0;i--)
printf("%d",num1[i]);
else
printf("0\n");
}
void multi(char str1[],char str2[])//乘法函数
{
int len1,len2,i,j;
int a[M+10],b[M+10],c[M*2+10];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
len1=strlen(str1);
for(j=0,i=len1-1;i>=0;i--)//把数字倒过来
a[j++]=str1[i]-'0';
len2=strlen(str2);
for(j=0,i=len2-1;i>=0;i--)//倒转第二个整数
b[j++]=str2[i]-'0';
for(i=0;i<len2;i++)//用第二个数乘以第一个数,每次一位
for(j=0;j<len1;j++)
c[i+j]+=b[i]*a[j];//先乘起来,后面统一进位
for(i=0;i<M*2;i++)//循环统一处理进位问题
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
for(i=M*2;(c[i]==0)&&(i>=0);i--);//跳过高位的0
if(i>=0)
for(;i>=0;i--)
printf("%d",c[i]);
else
printf("0");
printf("\n");
}
main()
{
int x;
char qian1[M],qian2[M];
printf("请输入第一个数:");gets(qian1);
printf("请输入第二个数:");gets(qian2);
menu();
scanf("%d",&x);
switch(x)
{
case 1: add(qian1,qian2);break;
case 2: jian(qian1,qian2);break;
case 3: multi(qian1,qian2);break;
case 4: chufa(qian1,qian2,1);break;
}
}
{
int x;
char qian1[M],qian2[M];
printf("请输入第一个数:");gets(qian1);
printf("请输入第二个数:");gets(qian2);
menu();
scanf("%d",&x);
switch(x)
{
case 1: add(qian1,qian2);break;
case 2: jian(qian1,qian2);break;
case 3: multi(qian1,qian2);break;
case 4: chufa(qian1,qian2,1);break;
}
}