做的课程设计:超大数的计算
// 大数运算.cpp : Defines the entry point for the console application.//
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define size 1001
//--------大数除法-------
int comparebignumber(char a[],char b[])
{
int A,B;
//测出2个大数的长度
A=strlen(a);
B=strlen(b);
//比较2个大数的大小
if(A>B)
return 1;
if(A<B)
return 0;
if(strcmp(a,b)>0)
return 1;
if(strcmp(a,b)<0)
return 0;
if(strcmp(a,b)==0)
return 2;
}
//比较2个整型数组的大小 数组最高为对应最大位置
int compare(int a[],int b[],int n,int m) //n m分别代表a b两数组的长度
{
while(a[n-1]==0)
n--;
if(n>m)
return 1;
if(n==m)
for(int i=n;i>0;i--)
{
if(a[i-1]>=b[i-1])//倒序比较
return 1;
else
return 0;
}
if(n<m) return 0;
return 0;
}
int value(char a[],char b[],int C[],int n,char AA[],FILE *fp)
{
int c=0,B2[size],B[size],A1,B1,return1=0,j,sum[size],flag=0;
//初始化数组
for(int i=0;i<size;i++)
{
B2[i]=0;
B[i]=0;
sum[i]=0;
}
A1=strlen(a);
B1=strlen(b);
for(int q=(j=strlen(a))-1;q>=0;--q)
{
sum[j-q-1]+=(a[q]-'0');
// printf("sum的值啊%d\n",sum[j-q-1]);
}
for(int w=(j=strlen(b))-1;w>=0;--w)
{
B[j-w-1]+=(b[w]-'0');
// printf("B的值啊%d\n",B[j-w-1]);
}
//while 语句做减法 并起判断边界的作用
while(compare(sum,B,A1,B1)==1)
{
for(int e=0;e<size;e++)//正序比较
{
sum[e]=sum[e]-B[e]+c;//0位是最低位
if(sum[e]<0)
{
sum[e]+=10;
c=-1;
}
else
c=0;
}
return1++;
}
printf("%d",return1);//输出的数字
fprintf(fp,"%d",return1);
//处理AA数组
int t=0;
for(int u=A1-1;u>=A1-n;u--)
{
AA[t]=sum[u]+'0';
t++;
}
AA[t]='\0';
while(AA[0]=='0')
{
for(int x=0;x<(strlen(AA));x++)
AA[x]=AA[x+1];
}
//处理前面位数为零的项
while(sum[A1-1]==0)
A1--;
//当sum数组的值全部为0时
if(A1<=0)
return 2;
//用数组a存储余数
for(int v=0;v<A1;v++)
{
a[v]=sum[A1-v-1]+'0'; //a[0]代表最高位
}
a[v]='\0';
return 1;
}
void increasementb(char a[],char b[])
{
int m,A,B,flag=1;
A=strlen(a);
B=strlen(b);
m=A-B;
//对b数组进行补零
for(int i=0;i<B;i++)//判断边界条件
{
if(a[i]<b[i])
flag=0;
}
if(flag!=0)
{
for(int j=0;j<m;j++)
{
b[B+j]='0';
}
b[B+j]='\0';
}
else
{
for(int j=0;j<m-1;j++)
{
b[B+j]='0';
}
b[B+j]='\0';
}
}
int increasezero(char a[],char AA[],char b[],int count,FILE *fp)
{
int n=0,m=strlen(AA),y=0;
do
{
AA[m+n]=a[count+n];
AA[m+n+1]='\0';
n++;
y=count+n;
}
while(comparebignumber(AA,b)==0&&y!=strlen(a));
if(y==strlen(a)&&comparebignumber(AA,b)==0) //控制零处最难之处
{
fprintf(fp,"%c",'0');
printf("0");
}
for(int p=0;p<n-1;p++)
{
fprintf(fp,"%c",'0');
printf("0");
}
return 1;
}
int divise(FILE *fp)
{
char q[size],t[size],copyA[size],AA[size],a[size],b[size];
int A,B,C[size],j,c=0,l=0,f,m,u=0,A1,flag=1;
//初始化a和sum内的值
for(int i=0;i<size;i++)
{
a[i]='0';
b[i]='0';
q[i]='0';
C[i]=0;
}
scanf("%s",a);
fprintf(fp,"%s\n",a);
getchar();
gets(b);
fprintf(fp,"%s\n",b);
t[0]='\0';
strcpy(copyA,a);
strcpy(q,b);
if(comparebignumber(a,b)==2)
{
fprintf(fp,"%c",'1');
printf("1");
return 1;
}
if(comparebignumber(a,b)==0)
{
fprintf(fp,"%c",'0');
printf("0");
return 1;
}
A=strlen(a);
B=strlen(b);
m=A-B;
int count=0; //计算算了多少位了
do
{
increasementb(a,b);//对b数组进行补零
if(value(a,b,C,B,AA,fp)==2)//当sum数组全部为零时
return 2;
count=A-strlen(a);
increasezero(copyA,AA,q,count,fp);
strcpy(b,q); //将b数组更改回原形
}
while(comparebignumber(a,b)==1||comparebignumber(a,b)==2);//当a数组小于b数组 结束循环
return 1;
}
//------大数乘法------
//将数组初始化
void init(char *p)
{
for(int i=0;i<=999;i++)
p[i]='\0';
}
//处理负数
int deal(char *p)
{
int i=0;
if(p[0]=='-')
{
while(p[i]!='\0')
i++;
for(int j=0;j<i;j++)
p[j]=p[j+1];
return 1;
}
return 0;
}
//计算输入字符的个数
int cal(char *p)
{
int i=0;
while(p[i]!='\0')
i++;
return i-1;
}
//将输入的字符进行倒置
void fun(char *p,int n)
{
int m;
for(int i=0;i<=n/2;i++)
{
m=p[i];
p[i]=p[n-i];
p[n-i]=m;
}
}
void change(char *p,int n)
{
int i;
for(i=0;i<=n;i++)
p[i]=p[i]-'0';
}
//进位处理
void cha(char *p)
{
int i=999;
while(p[i]=='\0')
i--;
for(int j=0;j<=i;j++)
{
while(p[j]>=10||p[j]<0)
{
if(p[j]<0)
{
p[j+1]--;
p[j]+=10;
}
else
{
p[j+1]++;
p[j]-=10;
}
}
}
}
int nulbipict(FILE *fp)
{
char c[size],a[size],b[size];;
int t,i,j,taga,tagb;
init(a); //初始化三数组
init(b);
init(c);
scanf("%s",a);
fprintf(fp,"%s\n",a);
scanf("%s",b);
fprintf(fp,"%s\n",b);
taga=deal(a); //标记是否为负数
tagb=deal(b);
int m=cal(a); //计算字符的位数
int n=cal(b);
fun(a,m); //进行倒置
fun(b,n);
change(a,m);
change(b,n);
for(i=0;i<=m;i++) //乘法运算
for(j=0;j<=n;j++)
{
t=j+i;
c[t]=c[t]+a[i]*b[j];
}
cha(c); //进位处理
i=999;
while(c[i]=='\0')
i--;
if(taga!=tagb) //判断结果是否为负
printf("-");
for(j=i;j>=0;j--)
{
printf("%d",c[j]); //输出值
fprintf(fp,"%d",c[j]); //输到文件中
}
printf("\n");
return 0;
}
//-------大数减法--------
int subtraction (FILE *fp)
{
char a[size],b[size];
int A[size],B[size],sum[size],j,c=0,k,l,flag=0;
//初始化a和sum内的值
for(int i=0;i<size;i++)
{
a[i]='0';
b[i]='0';
A[i]=0;
B[i]=0;
}
scanf("%s",a);
fprintf(fp,"%s\n",a);
getchar();
gets(b);
fprintf(fp,"%s\n",b);
//将字符串转换成整数型
//二个大数相等的情形
if(comparebignumber(a, b)==2)
{
printf("0");
return 1;
}
//二个大数不相等的情形
if(comparebignumber(a, b))
{
for(int q=(j=strlen(a))-1;q>=0;--q)
A[j-q-1]+=(a[q]-'0');
for(int w=(j=strlen(b))-1;w>=0;--w)
B[j-w-1]+=(b[w]-'0');
}
else
{
for(int q=(j=strlen(b))-1;q>=0;--q)
A[j-q-1]+=(b[q]-'0');
for(int w=(j=strlen(a))-1;w>=0;--w)
B[j-w-1]+=(a[w]-'0');
flag=-1; //做个标志
}
//二个大数之间的进位计算
for(int e=0;e<size;e++)
{
sum[e]=A[e]-B[e]+c;
if(sum[e]<0)
{
sum[e]+=10;
c=-1;
}
else
c=0;
}
k=size-1;
//大数的输出
while(!sum[k])
k--; //逆序输出去除零项
//若第一个数小于第二个数则输出负数
if(flag==-1)
{
fprintf(fp,"%c",'-');
printf("-");
}
for(l=k;l>=0;l--)
{
printf("%d",sum[l]);
fprintf(fp,"%d",sum[l]);
}
return 0;
}
//----------大数加法---------
int add (FILE *fp)
{
int A[size],B[size],sum[size],j,c=0,k,l;
char a[size],b[size];
//初始化a和sum内的值
for(int i=0;i<size;i++)
{
a[i]='0';
b[i]='0';
A[i]=0;
B[i]=0;
}
scanf("%s",a);
fprintf(fp,"%s\n",a);
getchar();
gets(b);
fprintf(fp,"%s\n",b);
//将字符串转换成整数型
for(int q=(j=strlen(a))-1;q>=0;--q)
A[j-q-1]+=(a[q]-'0');
for(int w=(j=strlen(b))-1;w>=0;--w)
B[j-w-1]+=(b[w]-'0');
for(int e=0;e<size;e++)
{
sum[e]=A[e]+B[e]+c;
c=sum[e]/10;
sum[e]=sum[e]%10;
}
//大数的输出
k=size-1;
while(!sum[k]) k--;
for(l=k;l>=0;l--)
{
printf("%d",sum[l]);
fprintf(fp,"%d",sum[l]);
}
return 0;
}
//------主函数--------
int main()
{
int choice;
FILE *fp;
if((fp=fopen("程序设计.txt","w"))==NULL)
{
printf("File open error!\n");
exit (0);
}
//输出界面
printf("///////////////////////////////////////////////\n");
printf("-------------------------------------------\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| 欢迎使用本计算器 |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("-------------------------------------------\n");
printf("1:两个大数的加法运算\n2:两个大数的减法运算\n3:两个大数的乘法运算\n4:两个大数的除法运算\n");
printf("请选择相应的操作:\n");
fprintf(fp,"///////////////////////////////////////////////\n");
fprintf(fp,"课程设计名称: 大数的运算\n");
fprintf(fp,"参与课程设计的成员:胡腾腾 阳林 唐贵华\n");
fprintf(fp,"-------------------------------------------\n");
fprintf(fp,"| 欢迎使用本计算器 |\n");
fprintf(fp,"| 1 2 3 |\n");
fprintf(fp,"| |\n");
fprintf(fp,"| |\n");
fprintf(fp,"| 4 5 6 |\n");
fprintf(fp,"| |\n");
fprintf(fp,"| |\n");
fprintf(fp,"| |\n");
fprintf(fp,"| 7 8 9 |\n");
fprintf(fp,"| |\n");
fprintf(fp,"-------------------------------------------\n");
fprintf(fp,"1:两个大数的加法运算\n2:两个大数的减法运算\n3:两个大数的乘法运算\n4:两个大数的除法运算\n");
fprintf(fp,"请选择相应的操作:\n");
scanf("%d",&choice);
fprintf(fp,"%d\n",choice);
switch(choice)
{
case 1:
add(fp);
break;
case 2:
subtraction (fp);
break;
case 3:
nulbipict(fp);
break;
case 4:
divise(fp);
break;
}
if(fclose(fp))
{
printf("can not close the file\n");
exit (0);
}
return 0;
}