大数的四则运算(加,减,乘,除)处理
其中最难的是大数相除,可以从后前看
文章目录
- 一、大数相除
- 基本思路
- 代码如下
- 测试结果
- 二、大数相乘
- 基本思路
- 代码如下
- 测试结果
- 三、大数相减
- 基本思路
- 代码如下
- 测试结果
- 四、大数相加
- 基本思路
- 代码如下
- 测试结果
一、大数相除
基本思路
大数除法是四则运算里面最难的一种。不同于一般的模拟,除法操作不是模仿手工除法,而是利用减法操作来实现的。其基本思想是反复做除法,看从被除数里面最多能减去多少个除数,商就是多少。逐个减显然太慢,要判断一次最多能减少多少个整数(除数)的10的n次方。
以7546除以23为例:
先用7546减去23的100倍,即减去2300,可以减3次,余下646,此时商就是300 (300=1003);
然后646减去23的10倍,即减去230,可以减2次,余下186,此时商就是320 (320=300+102);
然后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;
}
测试结果
二、大数相乘
基本思路
- 使用字符串对数据的输入
- 字符串倒序转换成数字
- 两个数组模仿乘法处理实现相乘,注意处理进位
- 消去多余的0
- 将结果翻转输出即为大数相乘的结果
代码如下
#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;
}
测试结果
大数的四则运算(加,减,乘,除)处理相关推荐
- c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...
共回答了23个问题采纳率:82.6% #include #define MaxSize 99 void trans(char str[],char exp[]) /*将算术表达式转换成后追表达式*/ ...
- oracle sql语句加减,实现四则运算的一条sql语句
实现四则运算的一条sql语句 1.建立一个测试表 create table mar_test( id number, text varchar2(200)) insert into mar_Test ...
- 大数高精度加减、乘除、开根(C++版全套最详细、最易懂)
大数高精度加减.乘除.开根 一.前面铺垫 二.加法 三.减法 四.乘法 五.除法 六.开根(待完善) 大数高精度加减乘除主要用在超过long型的数字计算(比如1000位数), 最基本的思路就是换成 ...
- 大数运算(加、减、乘、除)--C++
**将大数存储在string中,因为long long类型无法包括超级的大数 **将string中的字符串放在int数组中,倒置处理(本人认为更方便) **按照每一位进行+ -运算,直到得出结果 数据 ...
- 大数的四则运算(加法、减法、乘法、除法)
大数的四则运算(加法.减法.乘法.除法) 前言: 在计算机中数字表示的范围是有限制的,比如我们熟知的 int.float.double 等数据类型所能表示的范围都是有限的,如果我们要对位数达到几十位. ...
- 两个多精度十进制数加法程序设计_初中数学之有理数的加减,学会加法,减法即会,掌握技巧轻松计算...
学习了有理数中的相关知识点,关于有理数的加减运算,也是考试中必考的内容,尤其是对于刚进入初中的学生来说,小数的时候学的加减法,到了初中突然发现数字前面有带符号了,其实整体而言,小学时候学的加减运算法则 ...
- javascript进制转换_JavaScript 加减危机——为什么会出现这样的结果?
在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...
- mysql实现俩个属性加减运算_1.3 算数运算符
(1)"运算符"和"数字"构成"表达式" Python中所谓的计算,就如同我们上数学课时所学的表达式.在四则运算当中,我们使用"+ ...
- php先乘除还是先加减,加减乘除运算法则是什么?
加减乘除运算法则是什么? 加减乘除法是基本的四则运算,在没有括号的情况下,运算顺序为先乘除,再加减. 加法交换律:a+b=b+a 加法结合律:a+b+c=a+(b+c) 乘法交换律:a*b=b*a 乘 ...
- php凑整10算法,加减凑整法教案
教案示例课题:口算整百.整千数的加减法教学目标1.使学生掌握口算整百.整千数加减法的计算方法,能正确地计算.2.初步培养学生的类推能力和的灵活性.3.初步培养学生仔细审题,认真计算的学习习惯.教学重点 ...
最新文章
- cocos2d-x android 移植 问题
- Linux终端的几个常用快捷方式,记下!
- 十年磨一剑!阿里OceanBase创纪录卫冕,中国数据库从此告别卡脖子
- go数组详解:数组的定义、遍历、使用细节、二维数组的定义及其遍历
- 设计模式的理解:桥模式 Bridge
- 启明云端应用分享|基于乐鑫 ESP-WIFI-MESH 的智能自助洗衣房
- cus.crm.notes.Component.extend(cus.crm.notes.ext.Component, {
- PHP 调用shell命令
- 一个页面多个ajax统一loading,页面有多个向后台发送的请求加载过程中显示loading,加载完成loading消失...
- 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版[精心整理].doc
- tplink软件升级有用吗_TP-LINK路由器升级方法 | 吴文辉博客
- 2017年IT168技术卓越奖评选获奖名单:投影篇
- c# 将dwg文件转化为pdf
- V831基础-GPIO
- apicloud常用方法总结
- cpu排行计算机专业,cpu性能天梯图,教您电脑cpu排行榜
- 音视频技术开发周刊 | 273
- DXF图纸打开后怎么改变保存其格式为DWG?
- DP什么意思 design pattern 设计模式 面向对象 概念大全
- Git详解之服务部署