明人不说暗话,直接上百度网盘链接,输入提取码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 ;
}
}

C语言课程设计大整数运算的更多相关文章

  1. Java语言课程设计——博客作业教学数据分析系统(201521123107 张翔)

    #Java语言课程设计--博客作业教学数据分析系统(个人博客) 1.团队课程设计博客链接 [博客作业教学数据分析系统(From:网络五条狗)](http://www.cnblogs.com/fanta ...

  2. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  3. C语言课程设计—图书管理系统

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<std ...

  4. C语言课程设计(成绩管理系统)

    C语言课程设计(成绩管理系统) 翻到了大学写的C语言课程设计,缅怀一下 内容: 增加学生成绩 查询学生成绩 删除 按照学生成绩进行排序 等 #include <stdio.h> #incl ...

  5. 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1821 解决:528 题目描述: Today, facing the rapid development of business, SJTU ...

  6. C语言课程设计

    目录 实现目的 游戏玩法介绍 实现流程与作品架构 任务列表及贡献度 总结感想 作品源码与仓库地址(附页) 资料引用与出处(附页) 实现目的 2048,作为一款极其经典的游戏,从发行到现在,已经有了极多 ...

  7. 基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

    大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 ...

  8. 大一C语言课程设计——班级档案管理系统

    记录我在大一第二学期期末做的C语言课程毕业设计 1. 班级档案管理系统运用到的主要结构体 typedef struct birthday //出生日期{int year;int month;int d ...

  9. A1136 | 字符串处理、大整数运算

    题目链接: https://www.patest.cn/contests/pat-a-practise/1136 今天是12月17号.最近这几天都有点不在状态.已经整整一周没有练算法了,自从12.3考 ...

随机推荐

  1. Java设计模式总汇一

    PS:首先我们要带着问题读文章 什么是设计模式 为什么要用设计模式 使用设计模式有什么好处 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了重用代码.让 ...

  2. ES6 二进制数组

    二进制数组(ArrayBuffer对象.TypedArray视图和DataView视图)是JavaScript操作二进制数据的一个接口.这些对象早就存在,属于独立的规格(2011年2月发布),ES6将 ...

  3. tr 命令详解

    tr  作用:标准输入中通过替换或删除操作进行字符转换 语法:tr -c -d -s ["string1_to_translate_from"] ["string2_to ...

  4. 求字符数组逆序数(poj1007)

    int InversionNumber(char* s,int len) { int ans=0;  //s逆序数 int A,C,G;  //各个字母出现次数,T是最大的,无需计算T出现次数 A=C ...

  5. Mysql使用alias 防止对数据的误操作

    在我们操作数据库的时候,尤其是执行,update,delete操作的时候,都存在着误操作的风险,今天发现一种方法,能避免这一问题,就是使用Mysql的alias . 1.查看Mysql帮助 #mysq ...

  6. JS对时间的操作

    JS时间操作大全 1.获取每个月的开始和结束. 2.获取每个季度的开始和结束. 3.获取当前季度. 4.把日期转换为字符串(支持各种格式) ... 5.未完待续,不断添加 String.prototy ...

  7. Keras:基于Theano和TensorFlow的深度学习库

    catalogue . 引言 . 一些基本概念 . Sequential模型 . 泛型模型 . 常用层 . 卷积层 . 池化层 . 递归层Recurrent . 嵌入层 Embedding 1. 引言 ...

  8. jQuery的get()post()getJson()方法

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...

  9. MySQL迁移方案(后续再补充)

    出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. ...

  10. chrome浏览器解决ajax跨域问题

    方法一 1.右键谷歌快捷方式,选择"属性". 2.打开属性窗口,切换到"快捷方式"选项卡. 3.在目标路径的后面添加[ --disable-web-securi ...