其中最难的是大数相除,可以从后前看

文章目录

  • 一、大数相除
    • 基本思路
    • 代码如下
    • 测试结果
  • 二、大数相乘
    • 基本思路
    • 代码如下
    • 测试结果
  • 三、大数相减
    • 基本思路
    • 代码如下
    • 测试结果
  • 四、大数相加
    • 基本思路
    • 代码如下
    • 测试结果

一、大数相除

基本思路

大数除法是四则运算里面最难的一种。不同于一般的模拟,除法操作不是模仿手工除法,而是利用减法操作来实现的。其基本思想是反复做除法,看从被除数里面最多能减去多少个除数,商就是多少。逐个减显然太慢,要判断一次最多能减少多少个整数(除数)的10的n次方。

以7546除以23为例:
先用7546减去23的100倍,即减去2300,可以减3次,余下646,此时商就是300 (300=1003);
然后646减去23的10倍,即减去230,可以减2次,余下186,此时商就是320 (320=300+10
2);
然后186减去23,可以减8次,余下2,此时商就是328 (328=320+1*8);
因为2除以23的结果小于1,而我们又不用计算小数点位,所以不必再继续算下去了。

代码如下

#include <stdio.h>
#include <string.h>#define MAXnumber 1000
int SubStract(int numdata1[], int num1size, int numdata2[], int num2size);int main()
{char num1[MAXnumber] = {0};       //除数char num2[MAXnumber] = {0};        //被除数int numdata1[MAXnumber] = {0};int numdata2[MAXnumber] = {0};int result[MAXnumber] = {0};    //结果int num1size,num2size;int dvalue;int nTemp;int i,j,x;//输入被除数与除数scanf("%s",num1);num1size = strlen(num1);scanf("%s",num2);num2size = strlen(num2);//字符串倒序转化成数字,也就是个位数在0号位置x = 0;for(i = num1size - 1; i >= 0; i--){numdata1[x] = num1[i] - 48;x++;}x = 0;for(i = num2size - 1; i >= 0; i--){numdata2[x] = num2[i] - 48;x++;}//将除数填充到与被除数相同的位数,也就是向右平移一个差值dvalue的位置。numdata2[i] = numdata2[i - dvalue]; //然后平移之后,其余数位填充为0.此时位数与被除数相同dvalue = num1size - num2size;for(i = num1size - 1; i >= 0; i--){if(i - dvalue >= 0){numdata2[i] = numdata2[i - dvalue];  //将除数扩大,使得除数和被除数位数相等}else{numdata2[i] = 0;      //其余填充为0}}num2size = num1size;         //更改被除数位数//此步为关键步骤,重复调用,同时记录减成功的次数,即为商//得到的商不可能大于差值,所以大范围循环是0-dvalue,目的是不断使对应的数位+1.//numdata2+i相当于除数向左移位,也就是去一个0;num2size - i表示被除数位数减一//由于除法运算是不断的相减,所以当被除数不够减时,最高位为0,此时记录其位数nTemp,再反复循环for(i = 0; i <= dvalue; i++){     while((nTemp = SubStract(numdata1, num1size, numdata2 + i, num2size - i)) >= 0 ){num1size = nTemp;   //结果长度result[dvalue - i]++;   //每成功减一次,将商的相应位加1}}//输出商,逆向输出printf("\n%s\n/\n%s\n=\n",num1,num2);for(i = dvalue; result[i] == 0; i--);for(; i >= 0; i--){printf("%d",result[i]);}//输出余数  printf("\n余数为");for(i = dvalue; numdata1[i] == 0; i--);for(; i >= 0; i--){printf("%d",numdata1[i]);}return 0;
}int SubStract(int numdata1[], int num1size, int numdata2[], int num2size)
{int i;//判断能否满足减法运算if(num1size < num2size){  return -1;}if(num1size == num2size){for(i = num1size - 1; i >= 0; i--){if(numdata1[i] > numdata2[i]){break;}else if(numdata1[i] < numdata2[i]){return -1;}}}//不够减借位for(i = 0; i <= num1size - 1; i++){numdata1[i] -= numdata2[i];if(numdata1[i] < 0){numdata1[i] += 10;numdata1[i+1]--;}}//查找结果的最高位,返回的是此时被除数的位数,两数相等时返回0.for(i = num1size - 1; i >= 0; i--){if(numdata1[i]){return (i+1);}}return 0;
}

测试结果

二、大数相乘

基本思路

  1. 使用字符串对数据的输入
  2. 字符串倒序转换成数字
  3. 两个数组模仿乘法处理实现相乘,注意处理进位
  4. 消去多余的0
  5. 将结果翻转输出即为大数相乘的结果

代码如下

#include <stdio.h>
#include <string.h>#define MAXnumber 1000int main()
{char firstnum[MAXnumber] = {0};char secondnum[MAXnumber] = {0};int firstnumdata[MAXnumber] = {0};int secondnumdata[MAXnumber] = {0};int resultdata[MAXnumber] = {0};int firstsize,secondsize;int i,j,x;scanf("%s",firstnum);    //输入第一个数据firstsize = strlen(firstnum); scanf("%s",secondnum);        //输入第二个数据secondsize = strlen(secondnum);//字符串转换成数据x = 0;for(i = firstsize - 1; i >= 0; i--){ firstnumdata[x] = firstnum[i] - 48;x++;}x = 0;for(i = secondsize - 1; i >= 0; i--){secondnumdata[x] = secondnum[i] - 48;x++;}//大数相乘并处理好进位for(j = 0; j < secondsize; j++){for(i = 0; i < firstsize; i++){resultdata[i+j] += firstnumdata[i]*secondnumdata[j];}}for(i = 0; i < MAXnumber; i++){if(resultdata[i] >= 10){resultdata[i+1] += resultdata[i]/10;resultdata[i] = resultdata[i]%10;}}//翻转输出,并消除末尾多余的0printf("%s*%s=",firstnum,secondnum);for(i = MAXnumber - 1; resultdata[i] == 0; i--);for(; i >= 0; i--){printf("%d",resultdata[i]);}return 0;
}

测试结果

三、大数相减

基本思路

方法相识,只是要做正负数的判断处理,同时不够减时向高位借位。

代码如下

#include <stdio.h>
#include <string.h>#define MAXnumber 1000int main()
{char num1[MAXnumber] = {0};char num2[MAXnumber] = {0};int numdata1[MAXnumber] = {0};int numdata2[MAXnumber] = {0};int result[MAXnumber] = {0};int num1size,num2size;int i,j,x;int flag = 1;  //默认是正整数scanf("%s",num1);num1size = strlen(num1);scanf("%s",num2);num2size = strlen(num2);//字符串转换成数据x = 0;for(i = num1size - 1; i >= 0; i--){numdata1[x] = num1[i] - 48;x++;}x = 0;for(i = num2size - 1; i >= 0; i--){numdata2[x] = num2[i] - 48;x++;}//结果的正负号处理if(num1size < num2size){ //长度不匹配,负数flag = 0;}else if(num1size == num2size){    //从高位开始匹配每一位,若被减数较小,负数for(x = num1size - 1; x >= 0; x--){if(numdata1[x] == numdata2[x]){continue;}else if(numdata1[x] < numdata2[x]){flag = 0;break;}}}//减法处理,不够减向高位借位if(flag){for(i = 0; i < MAXnumber; i++){if(numdata1[i] < numdata2[i]){numdata1[i+1]--;result[i] = numdata1[i]+10-numdata2[i];}else{result[i] = numdata1[i]-numdata2[i];}}    }else{for(i = 0; i < MAXnumber; i++){if(numdata2[i] < numdata1[i]){numdata2[i+1]--;result[i] = numdata2[i]+10-numdata1[i];}else{result[i] = numdata2[i]-numdata1[i];}} }//结果翻转输出printf("\n%s\n-\n%s\n=\n",num1,num2);if(flag == 0){printf("-");}for(i = MAXnumber - 1; result[i]==0; i--);for(; i >= 0; i--){printf("%d",result[i]);}return 0;
}

测试结果

四、大数相加

基本思路

同样是利用数组不断的进位,最后消0反转输出

代码如下

#include <stdio.h>
#include <string.h>#define MAXnumber 1000int main()
{char num1[MAXnumber] = {0};char num2[MAXnumber] = {0};int numdata1[MAXnumber] = {0};int numdata2[MAXnumber] = {0};int result[MAXnumber] = {0};int num1size,num2size;int i,j,x;scanf("%s",num1);num1size = strlen(num1);scanf("%s",num2);num2size = strlen(num2);x = 0;for(i = num1size - 1; i >= 0; i--){numdata1[x] = num1[i] - 48;x++;}x = 0;for(i = num2size - 1; i >= 0; i--){numdata2[x] = num2[i] - 48;x++;}for(i = 0; i < MAXnumber; i++){result[i] = numdata1[i] + numdata2[i];}for(i = 0; i < MAXnumber; i++){if(result[i] >= 10){result[i+1]++;result[i] = result[i] % 10;}}printf("\n%s\n+\n%s\n=\n",num1,num2);for(i = MAXnumber - 1; result[i]==0; i--);for(; i >= 0; i--){printf("%d",result[i]);}return 0;
}

测试结果

大数的四则运算(加,减,乘,除)处理相关推荐

  1. c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...

    共回答了23个问题采纳率:82.6% #include #define MaxSize 99 void trans(char str[],char exp[]) /*将算术表达式转换成后追表达式*/ ...

  2. oracle sql语句加减,实现四则运算的一条sql语句

    实现四则运算的一条sql语句 1.建立一个测试表 create table mar_test( id number, text varchar2(200)) insert into mar_Test ...

  3. 大数高精度加减、乘除、开根(C++版全套最详细、最易懂)

    大数高精度加减.乘除.开根 一.前面铺垫 二.加法 三.减法 四.乘法 五.除法 六.开根(待完善)   大数高精度加减乘除主要用在超过long型的数字计算(比如1000位数), 最基本的思路就是换成 ...

  4. 大数运算(加、减、乘、除)--C++

    **将大数存储在string中,因为long long类型无法包括超级的大数 **将string中的字符串放在int数组中,倒置处理(本人认为更方便) **按照每一位进行+ -运算,直到得出结果 数据 ...

  5. 大数的四则运算(加法、减法、乘法、除法)

    大数的四则运算(加法.减法.乘法.除法) 前言: 在计算机中数字表示的范围是有限制的,比如我们熟知的 int.float.double 等数据类型所能表示的范围都是有限的,如果我们要对位数达到几十位. ...

  6. 两个多精度十进制数加法程序设计_初中数学之有理数的加减,学会加法,减法即会,掌握技巧轻松计算...

    学习了有理数中的相关知识点,关于有理数的加减运算,也是考试中必考的内容,尤其是对于刚进入初中的学生来说,小数的时候学的加减法,到了初中突然发现数字前面有带符号了,其实整体而言,小学时候学的加减运算法则 ...

  7. javascript进制转换_JavaScript 加减危机——为什么会出现这样的结果?

    在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...

  8. mysql实现俩个属性加减运算_1.3 算数运算符

    (1)"运算符"和"数字"构成"表达式" Python中所谓的计算,就如同我们上数学课时所学的表达式.在四则运算当中,我们使用"+ ...

  9. php先乘除还是先加减,加减乘除运算法则是什么?

    加减乘除运算法则是什么? 加减乘除法是基本的四则运算,在没有括号的情况下,运算顺序为先乘除,再加减. 加法交换律:a+b=b+a 加法结合律:a+b+c=a+(b+c) 乘法交换律:a*b=b*a 乘 ...

  10. php凑整10算法,加减凑整法教案

    教案示例课题:口算整百.整千数的加减法教学目标1.使学生掌握口算整百.整千数加减法的计算方法,能正确地计算.2.初步培养学生的类推能力和的灵活性.3.初步培养学生仔细审题,认真计算的学习习惯.教学重点 ...

最新文章

  1. cocos2d-x android 移植 问题
  2. Linux终端的几个常用快捷方式,记下!
  3. 十年磨一剑!阿里OceanBase创纪录卫冕,中国数据库从此告别卡脖子
  4. go数组详解:数组的定义、遍历、使用细节、二维数组的定义及其遍历
  5. 设计模式的理解:桥模式 Bridge
  6. 启明云端应用分享|基于乐鑫 ESP-WIFI-MESH 的智能自助洗衣房
  7. cus.crm.notes.Component.extend(cus.crm.notes.ext.Component, {
  8. PHP 调用shell命令
  9. 一个页面多个ajax统一loading,页面有多个向后台发送的请求加载过程中显示loading,加载完成loading消失...
  10. 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版[精心整理].doc
  11. tplink软件升级有用吗_TP-LINK路由器升级方法 | 吴文辉博客
  12. 2017年IT168技术卓越奖评选获奖名单:投影篇
  13. c# 将dwg文件转化为pdf
  14. V831基础-GPIO
  15. apicloud常用方法总结
  16. cpu排行计算机专业,cpu性能天梯图,教您电脑cpu排行榜
  17. 音视频技术开发周刊 | 273
  18. DXF图纸打开后怎么改变保存其格式为DWG?
  19. DP什么意思 design pattern 设计模式 面向对象 概念大全
  20. Git详解之服务部署

热门文章

  1. 走Java道路怎么样,如何学习
  2. CentOS7-samba文件共享服务
  3. 大华摄像头实现web端实时播放以及录像回放
  4. 雾锁FCoin:局中局套住了谁?
  5. 信号与系统(二十一)——无失真传输和理想低通滤波器
  6. 前端Docker部署方案
  7. Centos7.6 2T以上硬盘GPT分区工具使用挂载教程
  8. 高德地图自己录制导航声音备份及恢复方法
  9. 【Java】检查二叉树是否平衡。
  10. SaaS企业如何构建与自身增长目标相匹配的组织力?