由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 。大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算。

简单表述大数运算实现过程:
1、加法:两数末尾对齐,自末端逐个相加,如果有进位则高位加一;
2、减法:比较好两数大小,大数减去小数,两数末尾对齐,自末端逐个相减,减不掉就向高位借一
3、乘法:取其中任意一个数,分别用此数各位中数字与另一个数字相乘,各个位置相乘的结果重叠部分相加,最终考虑进位关系。
4、除法:如果被除数大于被除数,先保持除数和被除数位数相同,然后被除数一次次减去除数,最终得到在此位之下被除数对于除数的倍数,改变位数,得到其他位数下的倍数,最终得到结果。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int a[1000],b[1000],c[1000];//返回两者较大值
int max(int a,int b){if(a>b)return a;else return b;
}//将数组设置为0
int setZero(int*num,int len){for(int i=0;i<len;i++)num[i]=0;
}//比较两个数组形式数字大小
int compare(int*num1,int*num2){int i,j;for(i=999;num1[i]==0;i--);for(j=999;num2[j]==0;j--);if(i<j)return -1;else if(i>j)return 1;else{for(;i>=0;i--){if(num1[i]>num2[i])return 1;else if(num1[i]<num2[i])return -1;}return 0;}
}//将一个数组赋给另一个数组
int copy(int*num1,int*num2){int i,j;for(i=0;i<1000;i++)num1[i]=0;for(i=999;num2[i]==0;i--);for(j=0;j<=i;j++)num1[j]=num2[j];return i+1;
}//大数加法
void add(char*str1,char*str2){setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s + %s = ",str1,str2);int i,carry=0;int len1=strlen(str1),len2=strlen(str2),len=max(len1,len2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';for(i=0;i<len;i++){c[i]=(a[i]+b[i]+carry)%10;carry=(a[i]+b[i]+carry)/10;}if(carry!=0)c[len++]=1;for(i=len-1;i>=0;i--)printf("%d",c[i]);printf("\n");
}//大数减法
void sub(char*str1,char*str2){setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s - %s = ",str1,str2);int i,borrow=0;int len1=strlen(str1),len2=strlen(str2),len=max(len1,len2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';  //初步根据位数判断两数大小  if(len2>len1){ printf("-");for(i=0;i<len;i++){c[i]=b[i]-a[i]-borrow;if(c[i]<0){borrow=1;c[i]+=10;}elseborrow=0;}}else{for(i=0;i<len;i++){c[i]=a[i]-b[i]-borrow;if(c[i]<0&&i+1<len){borrow=1;c[i]+=10;}elseborrow=0;}}//如果发现被减数小于减数,则重新计算,用减数减去被减数,输出负号 if(c[len-1]<0){printf("-");for(i=0;i<len;i++){c[i]=b[i]-a[i]-borrow;if(c[i]<0&&i+1<len){borrow=1;c[i]+=10;}elseborrow=0;}}while(c[len-1]==0&&len>1)len--;for(i=len-1;i>=0;i--)printf("%d",c[i]);printf("\n");
}//大数乘法
void mul(char*str1,char*str2) {setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s * %s = ",str1,str2);int i,j,k,carry=0,tmp; int len1=strlen(str1),len2=strlen(str2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';for(i=0;i<len1;i++){for(k=i,j=0;j<len2;j++,k++){c[k]+=a[i]*b[j];}}for(i=0;i<=k;i++) {c[i]+=carry;tmp=c[i];c[i]=tmp%10;carry=tmp/10;}for(i=k;c[i]==0;i--);for(;i>=0;i--)printf("%d",c[i]);printf("\n");
}//大数除法
void div(char*str1,char*str2){setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s / %s = ",str1,str2);int i,j,tmp,tmp2=0,borrow=0,temp[1000]={0},temp2[1000]={0};int len1=strlen(str1),len2=strlen(str2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';if(compare(a,b)<0){printf("0\n");return;}while(compare(a,b)>=0){          tmp=len1-len2;if(tmp==tmp2&&tmp>0)tmp--;tmp2=tmp;setZero(temp2,1000);for(i=len1-1;i>=tmp;i--)temp2[i]=b[i-tmp];copy(temp,a);if(compare(temp,temp2)<0)continue;for(j=1;;j++){borrow=0;for(i=tmp;i<len1;i++){temp[i]=a[i]-temp2[i]-borrow;if(temp[i]<0){borrow=1;temp[i]+=10;}elseborrow=0;}len1=copy(a,temp);         c[tmp]=j;if(compare(temp,temp2)<0)break;}}for(i=999;c[i]==0;i--);for(;i>=0;i--)printf("%d",c[i]);printf("\n");
}int main() {add("265151916516519419516","15616651622161651616");sub("163165165161984116165","15454874487989819449");mul("798794149194949451949","98491516194941631316");div("16516498416516516191981916516165","12345678");
}

代码效果:

C语言实现大数运算(长整数的加、减、乘、除)相关推荐

  1. 易语言练习笔记-大叔篇(3)-加减计算器

    易语言练习笔记-大叔篇(3)-加减计算器 省约时间,直接上代码,界面设计如下: 看代码输入效果,运行效果如下: 看懂的掌声.回复.关注,感谢! 以下没时间不需要看.... 到数值( ) 调用格式: 〈 ...

  2. 怎么用c语言进行大数运算

    在C语言中进行大数运算,一般有以下几种方式: 自己实现高精度计算库:通过定义自己的数据结构(比如用数组表示大整数)和实现基本的大数加减乘除等运算,可以实现高精度计算.但是这需要自己实现大量的代码,而且 ...

  3. 关于对C语言中数组名取地址加减等操作的一点探究

    对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...

  4. 浮点数的运算 —— 浮点数的加减运算

    题目 阶码运算和尾数运算分开进行.浮点数的加减运算一律采用补码. 一.真值到机器数的转换 二.对阶 使两个数的阶码相等,小阶向大阶看齐,尾数每右移一位,阶码加1 三.尾数加减 将对阶后的两个尾数按定点 ...

  5. java 加减运算_JAVA日期加减运算 | 学步园

    1.用java.util.Calender来实现 Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); Sys ...

  6. java时间差的百分之二十,Java对日期Date类进行加减运算、年份加减月份加减、时间差等等...

    实现代码一: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public c ...

  7. java当前月份减一个月_Java对日期Date类进行加减运算、年份加减月份加减、时间差等等...

    实现代码一: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public c ...

  8. c语言实现大数运算加法

    1 大数的概念 首先我们知道在编译系统中是可以实现加法,但是我们所定义的数据类型是有限的 int(四字节)时数的范围为-2147483648~2147483647[-2^31~2^31-1]: 即使是 ...

  9. C语言抽象数据类型实现复数的加减乘运算、输入实部虚部输出复数,输入复数输出实部虚部

    运行结果 #include<stdio.h> #include<stdlib.h> //头文件 typedef struct Complex //定义结构体类型Complex ...

最新文章

  1. 网络风行者(KSpider)的规则体系结构
  2. Android的Intent和IntentFilter应用说明一例
  3. gorm存指针数据_gormt: gormt 是一个数据库映射工具,可以将 mysql 数据库自动生成 golang sturct 结构...
  4. spring+mybatis实现读写分离
  5. mybatis_user_guide(6) Java API
  6. stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素
  7. C++静态类型成员变量的初始化顺序(单例模式)
  8. iphone字体_iPhone 适合老人盘吗?
  9. 基于visual Studio2013解决面试题之0210树的最远距离
  10. 只腐蚀毛刺 腐蚀算法_去毛刺工艺大全,一次性列举了14种方法,非常全面
  11. jDom 和dom4j 输出的中文乱码的解决方案
  12. python中使用%与.format格式化文本
  13. oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据
  14. POJ - 3461 (kmp)
  15. Linux端BaiduPCS-Go使用方法
  16. 【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
  17. 利用ace.js编写一个JavaScript编辑器(带智能补全)
  18. 强化物联网连接 Silicon Labs收购Micrium
  19. Should be compatible with WP_Widget::widget($args, $instance)
  20. APP定制开发的优势

热门文章

  1. DialogFragment 的使用
  2. 中国互联网+机器视觉行业商业模式创新与投资机会深度研究报告
  3. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
  4. Unit05: 创建和访问数组 、 数组的常用方法_1
  5. Java fork join ForkJoinPool 用法例子
  6. vim+vundle配置
  7. 创建 Pool VIP - 每天5分钟玩转 OpenStack(122)
  8. 2016.1.20 dubbo启动之后机器ip有问题
  9. Windows Live Writer发布测试
  10. [Ubuntu] 安装/卸载 声卡驱动