大数加法
2012-07-18 08:48
134 查看
所谓大数问题,既是高精度数问题。在C语言中,小数点后的位数是有限的,对于整数部分也有int和long long 的限制,这就导致当我们在求几十位甚至上百位的数字数,无法直接得到程序设计要求的精度。
对此现象,一个比较合理的解决办法既是建立数组对数据求解。
代码如下:
#include <stdio.h> #include <stdlib.h> #define SIZE 105 int main() { char input[SIZE]; int sum[SIZE]; memset(sum,0,sizeof(sum)); int i , j , c ; while(1) { scanf("%s",input); if(strcmp(input,"0")==0) break; i = (j = strlen(input)) - 1; for(;i>=0;i--) { sum[j-i-1]+=input[i]-'0'; if(sum[j-i-1]>=10) { sum[j-i-1] %= 10; sum[j-i]++; } } } c = 99; while(!sum[c]) c--; for(;c>=0;c--) printf("%d",sum[c]); printf("\n"); return 0; }
我们首先,设定一个char型的数组Input,注意这里一定是char型,因为如果是int的话我们是无法正确读入一个很长数位的数的。
sum用来逆序保存结果,之所以逆序,是因为如果顺序存储,当最高位产生进位时,不方便保存这个进位。(事实上,你也可以顺序存储,比如从第1位开始,第0位存放进位,但是当两个数位相差很大的数相加时又不方便调控,所以最方便的应该还是逆序存储,这样更具灵活性)
对于sum,首先置零,在每次对sum[i]进行存储时,必须进行的操作:
如果sum[i]<10,则在这一位上没有进位,无需额外操作;反之,有进位的情况下,假设前面每一步都处理得当,则此时的进位最多为一位(与阶乘的高精度数区别),此时,需要向i的高位,即第i+1位加1,对第i位进行模10操作。
需要注意的是,在sum[j-i-1]+=input[i]-'0';这一语句中,我们不可忘记-'0',因为在char型中,每个数都是以ASCII码的形式存储。
最后,当得到一个结果时,想要输出他,按照习惯,我们需要去掉最高位及其进位以前的零,这里也体现了逆序存储的优势,while循环即可实现。
相关文章推荐
- POJ 1053 Integer Inquiry && HDOJ 1047 Integer Inquiry (大数加法)
- 关于模拟大数溢出的解决方案————加法篇
- 51Nod1005 大数加法(C语言)
- hdu 1002 A + B Problem II(大数模拟加法)
- 大数加法
- java利用链栈实现大数加法问题
- 斐波那契额数列+大数加法
- HDU 1002大数加法
- 2018.2.13 LeetCode 415. Add Strings 【大数加法模拟】
- Hat's Fibonacci(大数加法+直接暴力)
- [大数加法]Add Binary
- 大数加法(整数的加法)
- HDOJ 1047 大数加法 水
- C++-大数加法模拟
- 大数加法(基础)
- 大数加法
- 哈理工OJ 2170 大斐波那契数(大数加法)
- 每日算法之大数加法
- POJ 2413 How many Fibs?#二分+大数加法
- 大数的加法和乘