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考 ...
随机推荐
- Delete 命令详解
cp:复制文件 /cp -r:复制目录 /bin/cp -f: 复制文件并覆盖已有文件(写命令的绝对路径/bin/) /cp /ect/passwd .:将其他文件复制到当前目录 /-n :不要 ...
- 串口调试者v2.1------开源c#串口调试工具
第一步:上图 第二步:上代码 >>>>>>>>>>>源代码下载<<<<<<<<< ...
- Java NIO (二) 缓冲区(Buffer)
缓冲区(Buffer):一个用于特定基本数据类型的容器,由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的Buffer 主要用于和NIO中的通道(Ch ...
- [转]Android sharedpreferences使用
1. SharedPerferences保存的数据主要是类似配置信息格式的数据,因此它保存的数据主要是简单类型的key-value对,SharedPreferences本身并没有写入数据的能力, ...
- 用C#实现微信“跳一跳”小游戏的自动跳跃助手
一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“打飞机”游戏,这游戏玩法简单,但加上了积分排名功能后,却成了“装逼”的地方,于是很多人花钱花时 ...
- Head First设计模式之桥接模式
一.定义 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. 主要解决:在多维可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活. 何时使 ...
- Sqlmap Tamper大全(1)
sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MS-SQL,,MYSQL,ORACLE和POSTGRESQL.SQLMAP采用四 ...
- Struts2内部执行过程
首先是Struts2的流程图. 一.当有一个请求的时候.执行以下流程. 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Act ...
- MyEclipse 2015利用Cygwin+CDT搭建C/C++开发环境
GitHub原文:https://github.com/x113773/testall/issues/22 首先安装Cygwin 1:首先去网站 www.cygwin.com 下载 Cygwin 的 ...
- linux中搭建solr集群出现org.apache.catalina.LifecycleException: Failed to initialize component ,解决办法
07-Jan-2018 20:19:21.489 严重 [main] org.apache.catalina.core.StandardService.initInternal Failed to i ...