高精度2--减法

高精度2--减法

一、心得

其实自己写之后会发现自己的思想和那些人给的思想差不多

自己先写然后再对照区看那些代码效果会好很多

/*

1、相等置为0,小置为-1,大为1

2、我的代码输出那里需要考虑两数相等,也就是a[0]==0的情况

3、小于的情况用 则用a=b-a,返回-1,则不需要交换a,b

4、修正a的位数:while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数

*/

二、代码及结果

自己代码

 1 /*
 2 减minus
 3 高精度减法
 4 1、逆序存储
 5 2、比较减数和被减数的大小,用大数去减小数,如果被减数小,则补负号
 6 3、借位相减
 7 4、输出结果
 8 */
 9 #include <iostream>
10 #include <string>
11 #define Max 105
12 using namespace std;
13 //传入数字字符串并将其逆序放在int数组中
14 int init(string s,int (&a)[Max]){
15     a[0]=s.length();
16     for(int i=a[0],j=0;i>=1;i--,j++){
17         a[i]=s[j]-‘0‘;
18     }
19 }
20 //输出逆序数组的内容
21 int printArray(int a[Max]){
22     for(int i=a[0];i>=1;i--){
23         cout<<a[i];
24     }
25     cout<<endl;
26 }
27 //比较大小,a数组大于b数组返回true,否则返回false
28 bool isFirstBig(int a[Max],int b[Max]){
29     if(a[0]>b[0]) return true;
30     if(a[0]<b[0]) return false;
31     if(a[0]==b[0]){
32         for(int i=a[0];i>=1;i--){
33             if(a[i]>b[i]) return true;
34             if(a[i]<b[i]) return false;
35         }
36     }
37     //如果相等的情况,返回true
38     return true;
39 }
40 //进行高精度相减的操作
41 void minusOperation(int (&a)[Max],int (&b)[Max]){
42     int firstBig=isFirstBig(a,b);
43     //如果被减数大,则输出负号并交换a,b
44     if(!firstBig){
45         cout<<"-";
46         int c[Max];
47         //交换a,b
48         for(int i=1;i<=b[0];i++){
49             c[i]=a[i];
50             a[i]=b[i];
51             b[i]=c[i];
52         }
53     }
54
55     for(int i=1;i<=a[0];i++){
56         a[i]-=b[i];
57         if(a[i]<0){
58             a[i+1]--;//向高位借位
59             a[i]=10+a[i];
60         }
61     }
62     //减法操作后去掉前面多余的0,并且修改位数
63     for(int i=a[0];i>=1;i--){
64         if(a[i]==0) a[0]--;
65         else break;
66     }
67
68
69 }
70 int main(){
71     int a[Max]={0},b[Max]={0};
72     string s1="221423423132141313412";
73     string s2="987654321012345678909";
74     init(s1,a);
75     init(s2,b);
76     cout<<"被减数"<<endl;
77     printArray(a);//打印被减数
78     cout<<"减数"<<endl;
79     printArray(b);//打印减数
80     minusOperation(a,b);
81     printArray(a);//打印结果
82     return 0;
83 } 

给的标准代码

/*

1、相等置为0,小置为-1,大为1

2、我的代码输出那里需要考虑两数相等,也就是a[0]==0的情况

3、小于的情况用 则用a=b-a,返回-1,则不需要交换a,b

4、修正a的位数:while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数

*/

 1 int compare(int a[],int b[])
 2      //比较a和b的大小关系,若a>b则为1,a<b则为-1,a=b则为0
 3 {   int i;
 4      if(a[0]>b[0])return 1;  //a的位数大于b则a比b大
 5      if(a[0]<b[0])return -1;  //a的位数小于b则a比b小
 6      for(i=a[0];i>=1;i--)  //否则a和b的位数相同,则从高位到低位比较
 7      {    if(a[i]>b[i])return 1;
 8            if(a[i]<b[i])return -1;
 9      }
10      return 0;//各位都相等则两数相等。
11 }
12 //思想:先判断大小,分情况用大数减小数的原则;
13 void jian(int a[],int b[])//计算a=a-b
14 {   int flag,i;
15     flag=compare(a,b); //调用比较函数判断大小
16     if (flag==0) {a[0]=0;return;} //相等
17     if(flag==1) //大于
18     {    for(i=1;i<=a[0];i++)
19           {   if(a[i]<b[i]){ a[i+1]--;a[i]+=10;} //若不够减则向上借一位
20                a[i]=a[i]-b[i];
21           }
22           while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数
23           return;
24     }
25     if (flag==-1)//小于  则用a=b-a,返回-1
26     {   cout<<"-";
27         for(i=1;i<=b[0];i++)
28          {    if(b[i]<a[i]){b[i+1]--;b[i]+=10;} //若不够减则向上借一位
29                a[i]=b[i]-a[i];
30          }
31          a[0]=b[0];
32          while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数
33          return;
34    }
35 } 
时间: 2024-11-09 17:44:37

高精度2--减法的相关文章

【高精度】减法神童

问题 D: [高精度]减法神童 时间限制: 1 Sec  内存限制: 64 MB提交: 7  解决: 5[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 在科学城里住着一位减法神童,他可以在一秒钟内算出两个数相减的结果.这两个数可不是普通的数字,它们是11位以上的"宠然大物".为了证明自己神奇的计算能力,减法神童请全城的人都来出题考自己,只要答错一题他就自愿放弃"减法神童"的称号. 你想考考减法神童吗?还是先编写一个程序帮我们算出任意两个11位以上的数

Codevs高精度入门(减法、加法和乘法)解题报告

题目:                                                  题目描述 Description 给出两个正整数A和B,计算A-B的值.保证A和B的位数不超过500位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Output Description 输出A-B的值 样例输入 Sample Input 3 12 样例输出 Sample Output -9 题目分析                          

高精度 加法 减法 乘法 除法 整合

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置. 很久不写高精了,虽说我觉得高精也不会考...还是稍微写一写,防止手生. 两个小时过去了…… 集合了高精+高精.高精-高精.高精*高精.高精/低精. 目前还没发现什么错误,应该可以应付各种情况. 本来想允许它读入负数的,结果发现减法读负数太麻烦了...所以只能读非负数. 下面贴代码. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #

c++ 高精度算法

包括: 两个高精度正整数加法 两个高精度正整数乘法 两个高精度正整数减法 两个高精度正整数除法 两个高精度正整数求余 两个高精度正整数数求最大公约数 两个高精度正整数数求最小公倍数 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //清除前缀0,如果结果是空字符串则设为0 7 inline void clear(string& a){ 8 while(a.length()>0

大整数四则运算

============ 日后再写!先将设计思想留下 ============= 定义并实现超长整数类double long,要求如下: 64位数据长度,有符号 支持+.-.*./运算 支持+=.-=./=运算 支持cin>>和cout<<操作 首先,我们的运算对象是大整数并且要支持cout<<和cin>>操作,数组和链表是可选择项.在这里我们用数组.数组有int型和char型,选哪个好呢?只能选char型,因为我们的大整数是有符号位的,必须用一个char字

这个文件必看啊 太好了

数学问题: 1.精度计算——大数阶乘 2.精度计算——乘法(大数乘小数) 3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数.最小公倍数 8.组合序列 9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分 11.行列式计算 12.求排列组合数 13.求某一天星期几 字符串处理: 1.字符串替换 2.字符串查找 3.字符串截取 4.LCS—最大公共子串长度 5.LCS-生成最大公共子串 6.数字转化为字符 计算几何: 1.叉乘

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

[Offer收割]编程练习赛57

A.1-偏差排列 dp? 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 LL f[55][3]; 5 6 int main(){ 7 int N; 8 scanf("%d", &N); 9 f[1][0] = f[1][2] = 1; 10 for(int i = 1; i < N; ++i){ 11 f[i+1][0] = f[i][0] + f[i][

高精度减法

高精度减法(a-b)(a>b且a,b均为正整数) .从键盘读入两个正整数,求它们的差. 分析:类似加法,可以用竖式求减法.在做减法运算时,需要注意的是:被减数必须比减数大,同时需要处理借位.高精度减法的参考程序: 1 program exam2; 2 const 3 max=200; 4 var 5 a,b,c:array[1..max] of 0..9; 6 n,n1,n2:string; 7 lena,lenb,lenc,i,x:integer; 8 begin 9 readln(n1);

C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题

1.高精度加法.减法.乘法 #include <stdio.h> #include <string.h> #include <malloc.h> void plus(char *a,char *b,char *c);//自定义高精度加法函数 void sub(char *a,char *b,char *c);//自定义高精度减法函数 void multiply(char *a,char *b,char *c);//自定义高精度乘法函数 int main() { char