博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美读书笔记(2)大数问题(高精度运算)
阅读量:4104 次
发布时间:2019-05-25

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

<1>大数相加

#include
#include
char a[10001],b[10001],sum[10002];int BigIntegerAdd(){ //两个数的长度 int lena = strlen(a); int lenb = strlen(b); //进位标记 int c = 0; int i,j,k; //初始化数组sum memset(sum,0,10001); //倒序相加 k = 0; for(i = lena-1,j = lenb-1;i >= 0 && j >= 0;i--,j--){ sum[k] = a[i] + b[j] - '0' + c; c = 0; //如果相加大于等于10 if(sum[k] > '9'){ sum[k] -= 10; c = 1; } k++; } //a > b while(i >= 0){ sum[k] = a[i] + c; c = 0; //如果相加大于等于10 if(sum[k] > '9'){ sum[k] -= 10; c = 1; } k++; i--; } //b > a while(j >= 0){ sum[k] = b[j] + c; c = 0; //如果相加大于等于10 if(sum[k] > '9'){ sum[k] -= 10; c = 1; } k++; j--; } //如果最后两个数相加有进位的情况 //例如:67 + 51:5+6有进位 if(c == 1){ sum[k++] = '1'; } //翻转 char temp; for(i = 0,j = k-1;i < j;i++,j--){ temp = sum[i]; sum[i] = sum[j]; sum[j] = temp; } return 0;}int main(){ while(scanf("%s %s",a,b) != EOF){ BigIntegerAdd(); puts(sum); }}

<2>大数相减

/*1.比较减数与被减数的长度,确定正负号2.模拟减法运算    (1)a[i] == b[j]     (2)a[i] < b[j] //借位    (3)a[i] > b[j]  */#include
#include
char a[10001],b[10001],sum[10001],temp[10001];int BigIntegerMinus(){ //两个数的长度 int lena = strlen(a); int lenb = strlen(b); //借位标记 int c = 0; int i,j,k,positive = 1; //判断正负号 if(lena < lenb || (lena == lenb && strcmp(a,b) < 0) ){ strcpy(temp,a); strcpy(a,b); strcpy(b,temp); positive = -1;//负号 lena = strlen(a); lenb = strlen(b); } //倒序相减 k = 0; for(i = lena-1,j = lenb-1;i >= 0 && j >= 0;i--,j--){ sum[k] = a[i] - b[j] + '0' + c; c = 0; //如果相减小于0 if(sum[k] < '0'){ sum[k] += 10; c = -1; } k++; } //a > b while(i >= 0){ sum[k] = a[i] + c; c = 0; //如果相减小于0 if(sum[k] < '0'){ sum[k] += 10; c = -1; } k++; i--; } //b > a while(j >= 0){ sum[k] = b[j] + c; c = 0; //如果相减小于0 if(sum[k] < '0'){ sum[k] += 10; c = -1; } k++; j--; } int index = k - 1; //检索高位,有可能相减为0 while(sum[index] == '0' && index > 0){ index--; } //正号 if(positive == 1){ sum[index+1] = '\0'; } //负号 else{ sum[++index] = '-'; sum[index+1] = '\0'; } //翻转 char t; for(i = 0,j = index;i < j;i++,j--){ t = sum[i]; sum[i] = sum[j]; sum[j] = t; } return 0;}int main(){ while(scanf("%s %s",a,b) != EOF){ BigIntegerMinus(); puts(sum); }}

<3>大数乘法

#include
#include
char a[10001],b[10001],c[20002];int BigIntegerMulti(){ int i,j,lena,lenb,lenc; //初始化 memset(c,'0',20002); //两个数的长度 lena = strlen(a); lenb = strlen(b); //乘积最大位数 lenc = lena + lenb - 1; //翻转 char temp; for(i = 0,j = lena-1;i < j;i++,j--){ temp = a[i]; a[i] = a[j]; a[j] = temp; } for(i = 0,j = lenb-1;i < j;i++,j--){ temp = b[i]; b[i] = b[j]; b[j] = temp; } //倒序相乘 /* 123 * 54 ------ 492 615 ----- 6642 */ int t; for(i = 0;i < lena;i++){ for(j = 0;j < lenb;j++){ /* c[i+j] = (a[i] - '0') * (b[j] - '0') + c[i+j]; 9 * 9 + '0' 超出char范围越界所以设置一个int临时变量t */ t = (a[i] - '0') * (b[j] - '0') + c[i+j] - '0'; //进位 c[i+j+1] = t / 10 + c[i+j+1]; c[i+j] = t % 10 + '0'; } } //确定乘积的位数 while(c[lenc] == '0' && lenc >0){ lenc--; } //注意:加'\0' c[lenc+1] = '\0'; //翻转 for(i = 0,j = lenc;i < j;i++,j--){ temp = c[i]; c[i] = c[j]; c[j] = temp; } return 0;}int main(){ while(scanf("%s %s",a,b) != EOF){ BigIntegerMulti(); puts(c); } return 0;}

自己写的如有问题,请告知一下。

转载地址:http://vwcsi.baihongyu.com/

你可能感兴趣的文章
第七章 - 本地方法栈
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
JDBC核心技术 - 下篇
查看>>
一篇搞懂Java反射机制
查看>>
一篇彻底搞懂Java注解与枚举类
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】树
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】树-中
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】线性结构
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】图
查看>>
剑指offer——矩阵中的路径
查看>>
剑指offer——栈的压入、弹出序列
查看>>
剑指offer——矩形覆盖
查看>>
剑指offer——圆圈中最后剩下的数
查看>>
剑指offer——整数中1出现的次数
查看>>
剑指offer——和为S的连续正数序列
查看>>
剑指offer——调整数组顺序使奇数位于偶数前面
查看>>
剑指offer——链表中倒数第k个结点
查看>>
剑指offer——数值的整数次方
查看>>
剑指offer——表示数值的字符串
查看>>