明人不说暗话,直接上百度网盘链接,输入提取码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. flask_restful 学习笔记

    from flask import Flask,make_response,jsonify,request,url_for,g from flask_restful import reqparse, ...

  2. ValueError: too many values to unpack (expected 2)

    记录下总是码错的地方 for key,value in final_table:#final_table is a dict 然后报错 File "./count_co_Mty_read_n ...

  3. bootstrap 导航栏鼠标悬停显示下拉菜单

    在jsp中加入一下代码: .navbar .nav > li:hover .dropdown-menu { display: block;} 全部代码如下所示: <%@ page lang ...

  4. 更好的小票打印体验,huanent.printer2.0发布

    huanent.printer2.0是一个专注消费小票打印的类库.拥有许多先进的特性例如居中打印.自动换行等特性,可以通过简洁的代码来打印出复杂的消费小票.huanent.printer通过MIT方式 ...

  5. Centos 7 防火墙firewalld命令

    今天自己在Hyper-v下搭建三台Linux服务器集群,用于学习ELKstack(即大数据日志解决技术栈Elasticsearch,Logstash,Kibana的简称),下载的Linux版本为cen ...

  6. View学习(四)-View的绘制(draw)过程

    View的draw过程相比之于measrue过程,也是比较简单的.并且在我们自定义View时,也经常需要重写onDraw方法,来绘制出我们要实现的效果. 如之前的文章所说,绘制的流程也是起始于View ...

  7. Hyper-V 虚拟网络设置

    目标:搭建一个主机上的网络用来链接主机和虚拟机,并且虚拟机可以通过主机上网. 步骤一:创建一个Internal Network. 步骤二: 创建虚拟机并设置Virtual Switch. 步骤三:将上 ...

  8. CSS样式表学习

    ---恢复内容开始--- 今天学习的主要内容是样式表和选择器. 1.样式表的分类 1.内联式样式表 特点:能实现精确控制,但是范围太小.页面显示的优先级高于其他样式表 2.内嵌式样式表 特点:必须在h ...

  9. Ubuntu初始化MySQL碰到的坑

    想着将MySQL初始化,改变一下存放数据文件的位置: root@ubuntu:/lvmdata# mkdir data root@ubuntu:/lvmdata# chown -R mysql:mys ...

  10. [SharePoint]解决用户权限被无缘无故自动删除的问题

    前几天在维护公司内网的时候接到了一个case, 说是某个用户的权限无缘无故的就会被SharePoint自动去掉. 刚开始我还不愿意相信这个用户的说法,认为可能是权限赋的方法不对,有可能是被其他人误删了 ...