C语言课程设计大整数运算
明人不说暗话,直接上百度网盘链接,输入提取码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语言课程设计大整数运算的更多相关文章
- Java语言课程设计——博客作业教学数据分析系统(201521123107 张翔)
		
#Java语言课程设计--博客作业教学数据分析系统(个人博客) 1.团队课程设计博客链接 [博客作业教学数据分析系统(From:网络五条狗)](http://www.cnblogs.com/fanta ...
 - 学生管理系统-火车订票系统 c语言课程设计
		
概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...
 - C语言课程设计—图书管理系统
		
这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<std ...
 - C语言课程设计(成绩管理系统)
		
C语言课程设计(成绩管理系统) 翻到了大学写的C语言课程设计,缅怀一下 内容: 增加学生成绩 查询学生成绩 删除 按照学生成绩进行排序 等 #include <stdio.h> #incl ...
 - 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
		
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1821 解决:528 题目描述: Today, facing the rapid development of business, SJTU ...
 - C语言课程设计
		
目录 实现目的 游戏玩法介绍 实现流程与作品架构 任务列表及贡献度 总结感想 作品源码与仓库地址(附页) 资料引用与出处(附页) 实现目的 2048,作为一款极其经典的游戏,从发行到现在,已经有了极多 ...
 - 基于Java的大整数运算的实现(加法,减法,乘法)学习笔记
		
大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 ...
 - 大一C语言课程设计——班级档案管理系统
		
记录我在大一第二学期期末做的C语言课程毕业设计 1. 班级档案管理系统运用到的主要结构体 typedef struct birthday //出生日期{int year;int month;int d ...
 - A1136 | 字符串处理、大整数运算
		
题目链接: https://www.patest.cn/contests/pat-a-practise/1136 今天是12月17号.最近这几天都有点不在状态.已经整整一周没有练算法了,自从12.3考 ...
 
随机推荐
- ffmpeg常用命令---转
			
1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acod ...
 - 理解Kubernetes(1):手工搭建Kubernetes测试环境
			
系列文章: 1. 手工搭建环境 1. 基础环境准备 准备 3个Ubuntu节点,操作系统版本为 16.04,并做好以下配置: 系统升级 设置 /etc/hosts 文件,保持一致 设置从 0 节点上无 ...
 - 第六节  etc/passwd  、etc/shadow  、 useradd  、 groupadd
			
调优方法原理:禁用atime的修改来节省cpu和内存资源.命令:mount noatime disk 1.配置文件1. /etc/passwd文档结构:由":" 分隔成7个字段&q ...
 - js随机数生成,生成m-n的随机数
			
使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数 var random = Math.random(); console. ...
 - sql sever[基本] ''增删改'' 随笔
			
结构语言分类 DDL(数据定义语言) create drop alter 创建删除以及修改数据库,表,存储过程,触发器,索引.... DML(数据操作语言) insert delete ...
 - 配置apache的文件访问路径
			
本例中,我们让apache访问"F:/testObject/php"路径: 一.修改http.conf文件配置 访问路径:"apache/conf/httpd.conf& ...
 - AspNet Core Web 应用程序的启动(有关  Program.cs类/ Startup.cs类 ) 当项目中干掉 Startup.cs  类如何设置启动 配置等等
			
.有关怎么创建Core MVC/API 这里就不说了,前段时间的博客有说过: 1. 项目生成后会有如图所示两个类 Program类Startup类 2. Startup类 初始内容 public ...
 - Go Language 开发环境搭建
			
[前言] Go语言是Google公司2009年发布的新一代的开发语言,其最大的亮点是原生自带并发,在合适的场合使用合适的代码,我们的系统将会更加完美.下面我们进行go语言的安装和配置. 一.下载安装 ...
 - Java学习笔记20---内部类之对成员内部类的补充说明(一)
			
上篇文章--笔记19简要介绍了成员内部类.局部内部类和匿名内部类,下面对成员内部类再补充一些内容. 主要有以下6点: 1.成员内部类不可以有静态成员,成员变量为static final时除外 2.外部 ...
 - uC/OS-II 内存管理
			
UC/OS-II 内存管理 1. 简介 uC/OS-II 不使用ANSI编译器的malloc(), free(),因为内存碎片,很可能获取不到一块连续的内存, 这在嵌入式系统中是很危险的.同时 ...