博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高精度加减
阅读量:5142 次
发布时间:2019-06-13

本文共 4717 字,大约阅读时间需要 15 分钟。

一、高精度数据的输入、存储

高精度数据往往数据长度比较长,常用字符数组或字符串进行输入,然后转化成int数组进行存储和操作

1     string sa,sb; 2     int a[200],b[200]; 3     //先全部置零,以免高位运算错误 4     memset(a,0,200);  5     memset(b,0,200); 6     int la,lb; //长度,即位数 7     cin >> sa >> sb; 8     la = sa.length(); 9     lb = sb.length();10     int i;11     //转换成int数组12     for(i = la;i >0;i --)13         a[i] = sa[la - i] - '0';14     for(i = lb;i > 0;i --)15         b[i] = sb[lb - i] - '0';

 

二、高精度加法

形式和思路类似我们笔算加法的思路,将低位对齐,从低位向高位逐位相加,逢十进一

这就要求我们在存储的时候从低位向高位存储,与平时写数字的次序相反

1     if(la < lb) 2     { 3         int flag = 0; //判断最终位数是原本数据中较长数据的位数还是较长数据位数加一 4         for(i=1;i <= lb;i ++) 5         { 6             b[i] = b[i] + a[i]; 7             if(b[i]/10 != 0) 8             { 9                 if(i == lb) flag = 1;10                 b[i + 1] ++; //进位11                 b[i] = b[i] % 10;12             }13         }14         if(flag) 15         {16             int zeroFlag = 0; //判断是否为零,若为零则直接输出零17             for(i = lb+1;i > 0;i --)18             {19                 if(b[i] != 0)zeroFlag = 1;20             }21             if(zeroFlag)22             {23                 for(i = lb+1;i > 0;i --)24                 cout << b[i];25             }26             else27             {28                 cout << "0";29             }30         }31         else32         {33             int zeroFlag = 0;34             for(i = lb;i > 0;i --)35             {36                 if(b[i] != 0)zeroFlag = 1;37             }38             if(zeroFlag)39             {40                 for(i = lb;i > 0;i --)41                 cout <
<= la;i ++)53 {54 a[i] = a[i] + b[i];55 if(a[i]/10 != 0)56 { 57 if(i == la) flag = 1;58 a[i + 1] ++; //进位59 a[i] = a[i] % 10;60 }61 }62 if(flag)63 {64 int zeroFlag = 0;65 for(i = la+1;i > 0;i --)66 {67 if(a[i] != 0)zeroFlag = 1;68 }69 if(zeroFlag)70 {71 for(i = la+1;i > 0;i --)72 cout << a[i];73 }74 else75 {76 cout << "0";77 }78 }79 else80 {81 int zeroFlag = 0;82 for(i = la;i > 0;i --)83 {84 if(a[i] != 0)zeroFlag = 1;85 }86 if(zeroFlag)87 {88 for(i = la;i > 0;i --)89 cout << a[i];90 }91 else92 {93 cout << "0";94 }95 }96 }

 

  三、高精度减法

  思路依然类似笔算减法的思路,这里先判断符号,然后用大数减去小数算出绝对值,再在输出过程中添加符号

  从低位向高位开始减,注意借位即可

1 int resultCompare = compare(a,b,la,lb); //a,b的比较结果 2     if(resultCompare == -1) //a,b相等,相减为0 3     { 4         cout << "0" <
b,正 7 { 8 for(i = 1;i <= la;i ++) 9 {10 if(a[i] >= b[i]) a[i] = a[i] - b[i];11 else12 {13 a[i] = a[i] + 10 - b[i];14 //借位15 for(j = i;j <= la - 1;j ++)16 {17 if(a[j+1] >= 1) {a[j+1] --;break;}18 else19 {20 a[j+1] = 9;21 }22 }23 }24 }25 int zeroFlag = 0;26 for(i = la;i > 0;i --)27 {28 if(!zeroFlag && a[i]!=0)29 {30 zeroFlag = 1;31 }32 if(zeroFlag)33 cout << a[i];34 }35 cout << endl;36 }37 else //a
<= lb;i ++)40 {41 if(b[i] > a[i]) b[i] = b[i] - a[i];42 else43 {44 b[i] = b[i] + 10 - a[i];45 //借位46 for(j = i;j <= lb - 1;j ++)47 {48 if(b[j+1] >= 1) {b[j+1] --;break;}49 else50 {51 b[j+1] = 9;52 }53 }54 }55 }56 int zeroFlag = 0;57 cout << "-";58 for(i = lb;i > 0;i --)59 {60 if(!zeroFlag && b[i]!=0)61 {62 zeroFlag = 1;63 }64 if(zeroFlag)65 cout << b[i];66 }67 cout <
b返回1;a
lb) return 1;//a>b73 else if (la < lb) return 0; //a
0;i --)78 if(a[i] > b[i]) return 1; //a>b79 else if(a[i] < b[i]) return 0; // a

 

转载于:https://www.cnblogs.com/enid-1999/p/9316328.html

你可能感兴趣的文章
jQuery on(),live(),trigger()
查看>>
Date Picker控件:
查看>>
你的第一个Django程序
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>