明人不说暗话,直接上百度网盘链接,输入提取码baxj即可下载。
该大整数运算系统用于对有符号的位数不超过500位的大整数进行加、减、乘、除四则运算和计算N(0<=N<=10000)的阶乘。
注意事项 :
1、操作期间,进行四则运算时若大整数为正数请直接省略‘+ ’号。\n");
2、该大整数运算系统设定处理位数不超过500位的大整数四则运算和计算N(0<=N<=10000)的阶乘,可根据情况调整相关程序参数,进行位数更大的四则运算和N值更大的阶乘计算。
3、为了保证程序设计流程的简捷性,该系统没有很高的操作容错性能,所以欲执行某项功能,请务必根据提示输入正确的选项值进行操作。
课程设计中包含程序,程序运行所需文件,设计报告(电子版和打印版),应有尽有,欢迎小伙伴们在本博客的文件中下载使用。
下面的程序正常运行需要在百度网盘中下在相应输出文件,否则无法正常使用哦。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include <conio.h>
const int N1=;
const int N2=; void Display(); //显示主菜单
char* Input(char str[]); //输入
void Output(int result[],int j); //输出
int Add(char str1[],char str2[],int result[]); //相加
int Sub(char str1[],char str2[],int result[]); //相减
int Mul(char str1[],char str2[],int result[]); //相乘
int Div(char str1[],char str2[],int result[]); //相除
int Fac(int n,int result[]); //计算阶乘
int Substract(int *bjs,int *js,int Num_len1,int Num_len2); //计算差的位数
//以上函数返回值为int类型的均是结果的首位非零数字在数组中的下标,小于0表示无结果不输出
int IsBig_num(char str1[],char str2[]); //比较 int main()
{
int select,op,n,rs=-,result[N1];
//rs表示该数的首位非零数字在数组中的下标,小于0表示无结果不输出
char str1[N2],str2[N2],*Fir_num,*Sec_num;
while()
{
Display();
printf("\n请输入欲执行功能的选项值(0-4): ");
scanf("%d",&select);
switch(select)
{
case :
printf("\n\t\t1 加法运算\n");
printf("\n\t\t2 减法运算\n");
printf("\n\t\t3 乘法乘法\n");
printf("\n\t\t4 除法运算\n");
printf("\n请输入对应运算的选项值(1-4): ");
scanf("%d",&op);
memset(result,,sizeof(result));
switch(op)
{
case :
printf("\n请输入一个不超过500位的大整数作为 一个加数\n");
Fir_num=Input(str1);
printf("\n请输入另一个不超过500位的大整数作为 另一个加数\n");
Sec_num=Input(str2);
printf("\n两数之和为\n");
rs=Add(Fir_num,Sec_num,result);
break;
case :
printf("\n请输入一个不超过500位的大整数作为 被减数\n");
Fir_num=Input(str1);
printf("\n请输入另一个不超过500位的大整数作为 减数\n");
Sec_num=Input(str2);
printf("\n两数之差为\n");
rs=Sub(Fir_num,Sec_num,result);
break;
case :
printf("\n请输入一个不超过500位的大整数作为 一个因数\n");
Fir_num=Input(str1);
printf("\n请输入另一个不超过500位的大整数作为 另一个因数\n");
Sec_num=Input(str2);
printf("\n两数之积为\n");
rs=Mul(Fir_num,Sec_num,result);
break;
case :
printf("\n请输入一个不超过500位的大整数作为 被除数\n");
Fir_num=Input(str1);
printf("\n请输入另一个不超过500位的大整数作为 除数\n");
Sec_num=Input(str2);
printf("\n两数之商为\n");
rs=Div(Fir_num,Sec_num,result);
break;
default:
printf("\n无效输入\n");
}
break;
case :
printf("\n请输入N(0<=N<=10000)\n");
scanf("%d",&n);
if(n>||n<)
printf("\n错误输入(0<=N<=10000)\n");
else
{
memset(result,,sizeof(result));
rs=Fac(n,result);
printf("\n%d!为\n",n);
}
break;
case :
FILE *fp;
if(NULL==(fp=fopen("系统简介.txt","r")))
printf("文件打开失败!\n");
char ch1;
while(EOF != (ch1=fgetc(fp)))
{
printf("%c",ch1);
}
fclose(fp);
break;
case :
FILE *fq;
if(NULL==(fq=fopen("开发人员.txt","r")))
printf("文件打开失败!\n");
char ch2;
while(EOF != (ch2=fgetc(fq)))
{
printf("%c",ch2);
}
fclose(fq);
break;
case :
return ;
default:
printf("\n无效输入\n");
}
if(rs >= )
{
Output(result,rs);
rs=-;
}
printf("\n__________________________________________\n");
printf("\n按任意键继续 . . . ");
getch();
system("cls");
}
}
//主菜单
void Display(void)
{
printf("\n* * * * * * * * * * * * * * * * * * * * *\n");
printf("\t 大整数运算系统 \n");
printf("* * * * * * * * * * * * * * * * * * * * *\n");
printf("\t\t1 四则运算\t \t\n");
printf("\t\t2 计算N! \t\t\n");
printf("\t\t3 系统简介 \t\t\n");
printf("\t\t4 开发人员 \t\t\n");
printf("\t\t0 退出 \t\t\n");
printf("* * * * * * * * * * * * * * * * * * * * *\n");
}
//输入函数
char* Input(char str[])
{
scanf("%s",str);
char *p=str;
while(*p=='')
p++;
if(*p=='\0')
p--;
return p;
}
//输出函数
void Output(int result[],int j)
{
int i;
for(i=j;i>=;i--)
printf("%d",result[i]);
printf("\n");
}
//加法函数
int Add(char str1[],char str2[],int result[])
{
int Num_len1,Num_len2,l,i,j;
if(str1[]=='-'||str2[]=='-')
{
if(str1[]=='-'&&str2[]=='-')
{
printf("-");
str1++;
str2++;
}
else
{
if(str1[]=='-')
{
if(IsBig_num(str1+,str2)==)
return ;
else if(IsBig_num(str1+,str2)<)
return Sub(str2,str1+,result);
else
{
printf("-");
return Sub(str1+,str2,result);
}
}
else
{
if(IsBig_num(str1,str2+)==)
return ;
else if(IsBig_num(str1,str2+)>)
return Sub(str1,str2+,result);
else
{
printf("-");
return Sub(str2+,str1,result);
}
}
}
}
strrev(str1);
strrev(str2);
Num_len1=strlen(str1);
Num_len2=strlen(str2);
if(Num_len1>=Num_len2) {//按较大数的位数将小数高位用0补齐
l=Num_len1;
for(i=Num_len2;i<l;i++)
str2[i]='';
}
else{
l=Num_len2;
for(i=Num_len1;i<l;i++)
str1[i]='';
}
for(i=;i<l;i++){
result[i] += str1[i]-''+str2[i]-'';//一一对应-'0'
if(result[i] > )
{
result[i] %= ;
result[i+]++;//进位
}
}
for(j=i;j>=;j--)
if(result[j])//返回结果的非零首位在数组中的下标
return j;
return ;
}
//减法函数
int Sub(char str1[],char str2[],int result[])
{
int i,Num_len1,Num_len2;
char *temp;
if(str1[]=='-'||str2[]=='-')
{
if(str1[]=='-'&&str2[]=='-')
{
if(IsBig_num(str1+,str2+)==)
return ;
else if(IsBig_num(str1+,str2+)<)
{
temp=str2++;
str2=str1++;
str1=temp;
}
else
{
printf("-");
str1++;
str2++;
}
}
else
{
if(str1[]=='-')
{
printf("-");
return Add(str1+,str2,result);
}
else
return Add(str1,str2+,result);
}
}
else
{
if(IsBig_num(str1,str2)==)
return ;
else if(IsBig_num(str1,str2)<)
{
printf("-");
temp=str2;
str2=str1;
str1=temp;
}
}
Num_len1=strlen(str1);
Num_len2=strlen(str2);
strrev(str1);
strrev(str2);
if(Num_len1>Num_len2){//高位补零
for(i=Num_len2;i<Num_len1;i++)
str2[i]='';
}
for(i=;i<Num_len1;i++) {
result[i] += (str1[i]-'') - (str2[i]-'');
if(result[i] < ){
result[i] += ;
result[i+]--;
}
}
for(i=Num_len1-;i>=;i--)
if(result[i])
return i;
return ;
}
//乘法函数
int Mul(char str1[],char str2[],int result[])
{
int i,j,Num_len1,Num_len2;
if(str1[]=='-'||str2[]=='-')
{
if(str1[]=='-'&&str2[]=='-')
{
str1++;
str2++;
}
else
{
printf("-");
if(str1[]=='-')
str1++;
if(str2[]=='-')
str2++;
}
}
Num_len1=strlen(str1);
Num_len2=strlen(str2);
strrev(str1);
strrev(str2);
//乘积
for(i=;i<Num_len1;i++)
for(j=;j<Num_len2;j++)
result[i+j] += (str1[i]-'')*(str2[j]-'');
//处理进位
for(i=;i<N2*;i++) {
if(result[i] > )//先计算进位,否则前面的值先改变,不能进位
{
result[i+] += result[i] / ;
result[i] %= ;
}
}
//输出
for(i=*N2;i>=;i--)
if(result[i])
return i;
return ;
}
//除法函数
int Div(char str1[],char str2[],int result[])
{
int a[N2],b[N2];
int i,j,k,Num_len1,Num_len2,n;
if(str1[]=='-'||str2[]=='-')
{
if(str1[]=='-'&&str2[]=='-')
{
str1++;
str2++;
}
else
{
printf("-");
if(str1[]=='-')
str1++;
if(str2[]=='-')
str2++;
}
}
Num_len1=strlen(str1);
Num_len2=strlen(str2);
if(Num_len2== && str2[]==''){
printf("错误输入(除数不能为零)\n");
return -;
}
memset(a,,sizeof(a));//数组初始化
memset(b,,sizeof(b));
for(j=,i=Num_len1-;i>=;i--)
a[j++]=str1[i]-'';
for(j=,i=Num_len2-;i>=;i--)
b[j++]=str2[i]-''; Num_len1=Substract(a,b,Num_len1,Num_len2);
if(Num_len1<=){
if(Num_len1<) {
return ;//第一次减时不够减为
}
else {
result[]=;//正好够减商为
return ;
}
}
result[]++;
n=Num_len1-Num_len2;
if(n<) {
result[]=; //减过一次不够减商为
return ;
}
else if(n>) {
for(i=Num_len1-;i>=;i--) {//将减数逆置
if(i>=n)//倒着存储 当i大于等于n时,将i的位置存i-n的值,否则存0
b[i]=b[i-n];
else
b[i]=;
}
}
Num_len2=Num_len1;
for(j=;j<=n;j++) {
while( (k=Substract(a,b+j,Num_len1,Num_len2-j)) >= )//传递对应的参数
{
Num_len1=k;//更新长度
result[n-j]++;//n-j是对应的位权
}
}
for(i=;i<N2;i++){
if(result[i]>=)
result[i+] += result[i]/;//先进位再处理本位
result[i] %= ;
}
for(i=N2;i>=;i--)
if(result[i])
return i;
return ;
}
//计算差的长度函数
int Substract(int *bjs,int *js,int Num_len1,int Num_len2)
{
int i;
if(Num_len1<Num_len2)
return -;
bool bLarge=false;//长度相等的小于
if(Num_len1==Num_len2) {
for(i=Num_len1-;i>=;i--) {
if(bjs[i]>js[i])
bLarge=true;
else if(bjs[i]<js[i]) {
if(!bLarge)
return -;
}
}
}
for(i=;i<Num_len1;i++) {
bjs[i] -= js[i];
if(bjs[i]<) {
bjs[i] += ;
bjs[i+]--;
}
}
for(i=Num_len1-;i>=;i--)
if(bjs[i])
return i+;//返回长度加1
return ;
}
//计算阶乘函数
int Fac(int n,int result[])
{
int i,j,k,jw,t;
result[]=;
for(k=, i=;i<=n;i++){
for(jw=, j=;j<k;j++){
t = result[j]*i + jw;
result[j] = t%;
jw = t/;
}
while(jw)//直到上一个阶乘结果处理完后,将结果数组扩大,存进进位数即可
{
result[++k -]= jw%;
jw /= ;
}
}
return k-;
}
//比较函数
int IsBig_num(char str1[],char str2[])
{
int Num_len1,Num_len2;
Num_len1=strlen(str1);
Num_len2=strlen(str2);
if(Num_len1<Num_len2)
return -;
else
{
if(Num_len1==Num_len2)
{
if(strcmp(str1,str2)==)
return ;
else
{
if(strcmp(str1,str2)<)
return -;
else
return ;
}
}
else
return ;
}
}