- 6
- 0
- 约5.75千字
- 约 33页
- 2017-08-09 发布于重庆
- 举报
焦祺_关于高精度.ppt
关于高精度 焦祺 121602548@ 2008-11-5 Task: 高精度加法 高精度减法 高精度乘法(阶乘) 高精度除法(求余) 高精度数比较 Problem 1:a+b=? 输入:a b 输出:a+b的和 输入输出样例: Input: 1 2 Input:1234567890 8765432109 Output:3 Output:9999999999 PS: int32: -2147483648..2147483647 uint32:0..4294967295 Problem 1:a+b=? 观察人工计算的方法:竖式加法 223 + 996 ----------- 9 3+6=9 1 2+9=11,当前位1,进位1 2 2+9+1=12,当前位2,进位1 1 进位的1 ----------- 1219 大家试着多写几个例子 完成此程序 算法框架 A为AN位数,B为BN位数,结果存到C N=AN=BN?AN:BN;//求得两数的高位 for(从个位开始 TO 两数最高位N) { C的第i位 = A的第i位 + B的第i位 进位位 = C第i位 / 10 当前位的值 = C第i位 %10 } 算法实现 #include iostream using namespace std; #define M 250 int a[M]; //放待计算数字(加数) int b[M]; //放待计算数字(被加数) int c[M+1]; //存放和 char a1[M]; //存放字符串(加数) char b1[M]; //存放字符串(被加数) int i,ka,kb,k; void init(); //初始化函数 void output(); //输出函数 主函数 int main() { init(); //初始化 while (gets(a1),gets(b1)) //得到两a1,b1 { ka=strlen(a1);kb=strlen(b1);//求串长 k = ka=kb?ka:kb; //求两个串长的最长者 for(i=0; ika; i++)a[i] = a1[ka-i-1]-0;//将字符串a1逆序存到整型数组a for(i=0; ikb; i++)b[i] =b1[kb-i-1]-0;//将字符串b1逆序存到整型数组b for(i=0; ik ;i++) //数字处理 { c[i] += a[i]+b[i]; //处理a+b c[i+1] += c[i]/10; //处理进位数 c[i] = c[i]%10; //处理原位数 } output(); //输出 init(); //再初始化 } return 0; } 初始化函数 void init() { //可以用一个for memset(a1,NULL,sizeof(a1)); memset(b1,NULL,sizeof(b1)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); i = ka = kb = k = 0; } 输出函数 void output() { for(i=k;i=0;i--) { if (c[i] == 0 i==k) { //检查第一位是否为0 continue; } printf(%d,c[i]); } printf(\n); } 优化任务 这个简单版的做法容易理解且可以应付大多数的高精度加法问题 但还是有很多地方要改进 比如: (1)重用性:自己编写重用性更高的模板 (2)空间效率:每个INT元素可存8位完全十进制,而这里每个INT只存了一位!! (3)负数功能………… Problem 1:a+b=? 竖式加法优化举例 一次计算2位数,计算次数减少1/2 223 + 996 ----------- 19 23+96=119 ,当前位19,进位1 12 2+9+1=12 ----------- 1219 Problem 2:a-b=? 竖式减法: 927 - 896 ----------- 1 7-6=1 3 12-9=3,借位12 0 (9-1)-8=0 ----------- 31 算法框架 for(从个位开始 TO 两数最高位N) { if(a的第i位小于b的第i位) {//那么需要借位 借位位减1 当前位加10 } a第i位和b第i位的差存入a; } 算法
原创力文档

文档评论(0)