如何用c语言编写大数四则运算?所谓大数,就是数字非常(*100)的大,不管是int还是long long int都存储不下的数,如何进行加减乘除四则运算,这种情况在计算机的运算中还是很常见的,现将大致思路写上,并附上代码以供参考。
整体思路
首先数据必然是不能以int或者long long int存储,那么只能以字符串或者字符数组的形式存储。而且实际上,以字符数组接收数据最佳,然后把字符数组转化为int数组,再对数字进行计算。
其次,联想起我们小学二年级所学的加减乘除四则运算,我们会发现一个最基本的规律:
-
加减乘:从右往左计算
-
除法:从左往右计算
这就提示我们,数据需要进行一下处理,因为输入的数据是不定长的,所以我们需要把数据对齐。也就是说我们需要在加减乘,将数据倒过来,个位对个位,十分位对十分位;但是在除法中,我们只要按从左往右接收数据就可。
数据结构
int数组没有不能像字符数组那样,可以直接获取长度,所以最初想法就是在转化int数组的时候,再加上一个变量len,标记数组长度。
#define MAX 1000 struct bigNum{ int n[MAX]; int len; bigNum(){ memset(n, 0, sizeof(n)); len = 0; } };
数据处理
根据上边的思路,我们需要将char型数组转化为int型数组,而且是倒序,这样保证从个位开始对齐,方便加减乘运算,而除法只需要将char型数组转化为int型数组就可。当然还有一些其他的工具,比如比较两个bigNum的大小,这在减法和除法上需要用到,还有除法采用的是减法思想,所以除法的数组顺序也要有个调整。
// 加减乘处理使用 bigNum transfer(char str[]){ bigNum bn; bn.len = strlen(str); int i; for(i=0; i<bn.len; i++) bn.n[i] = str[bn.len-1-i] - '0'; return bn; } // 除法处理使用 bigNum transferSort(char str[]){ bigNum bn; bn.len = strlen(str); int i; for(i=0; i<bn.len; i++) bn.n[i] = str[i] - '0'; return bn; } // 加减乘处理使用 int compare(bigNum a, bigNum b){ if(a.len > b.len) return 1; else if(a.len < b.len) return -1; else{ int i; for(i=a.len-1; i>0; i--){ //高位比较 if(a.n[i] > b.n[i]) return 1; else if(a.n[i] < b.n[i]) return -1; else return 0; } } } // 除法处理使用 int compareSort(bigNum a, bigNum b){ if(a.len > b.len) return 1; else if(a.len < b.len) return -1; else{ int i; for(i=0; i<a.len; i++){ //高位比较 if(a.n[i] > b.n[i]) return 1; else if(a.n[i] < b.n[i]) return -1; else return 0; } } } // 倒序,除法用 void reverse(int a[], int len){ int i; for(i=0; i<len/2; i++){ int temp = a[i]; a[i] = a[len-1-i]; a[len-1-i] = temp; } }
大数加法
bigNum add(bigNum a, bigNum b){ // a+b bigNum c; int flag = 0; int len = (a.len > b.len) ? a.len : b.len; int i; for (i=0; i<len; i++){ int temp = a.n[i] + b.n[i] + flag; flag = (temp >= 10) ? 1 : 0; c.n[c.len++] = temp % 10; } // 处理进位情况 if(flag != 0) c.n[c.len++] = 1; return c; }
大数减法
bigNum sub(bigNum a, bigNum b){ // a-b 或 a+(-b) bigNum c; int len = (a.len > b.len) ? a.len : b.len; int i; for(i=0; i<len; i++){ if(a.n[i]<b.n[i]){ a.n[i+1]--; //借一 a.n[i] += 10; //当十 } c.n[c.len++] = a.n[i] - b.n[i]; } // 去除高位0 112-111=001,但是要保证有一位数 while(c.n[c.len-1]==0 && c.len>1) c.len--; return c; }
大数乘法
// 高精度与低精度乘法运算,为高精度乘法运算使用 bigNum sigMul(bigNum a, int b){ // 低精度 b bigNum c; int flag = 0; int i; for(i=0; i<a.len; i++){ int temp = a.n[i]*b + flag; c.n[c.len++] = temp % 10; flag = temp/10; } while(flag){ c.n[c.len++] = flag % 10; flag /= 10; } return c; } // 数组移位操作 bigNum move(bigNum a, int index){ bigNum b = bigNum(); int i; b.len = a.len + index; for(i=0; i<a.len; i++){ b.n[i+index] = a.n[i]; } return b; } // 高精度乘法运算 bigNum mul(bigNum a, bigNum b){ // 高精度 b bigNum c = bigNum(); int i; for(i=0; i<b.len; i++){ bigNum temp = sigMul(a, b.n[i]); bigNum temp_move = move(temp,i); c = add(c, temp_move); } return c; }
大数除法
// 高精度与低精度除法运算 逆序 bigNum sigDiv(bigNum a, int b, int &r){ bigNum c; c.len = a.len; int i; for(i=a.len-1; i>0; i--){ // 高位开始 r = r*10 + a.n[i]; if(r<b) c.n[i] = 0; else{ c.n[i] = r/b; r %= b; } } while(c.n[c.len-1]==0 && c.len>1) c.len--; return c; } // 高精度除法运算 bigNum div(bigNum a, bigNum b, bigNum r){ // 正序 计算大数 a/b bigNum c; c.len = a.len; int i; for(i=0; i<a.len; i++){ // 高位开始 r.n[r.len++] = a.n[i]; int flag = compareSort(r, b); if(flag == -1) c.n[i] = 0; else if(flag == 0){ c.n[i] = 1; // 无需翻转也能为0 r = sub(r, b); r.len = 0; // 结果为0,长度是1,这里需要处理,否则会多一位 } else{ // 做减法 int index = 0; while(compareSort(r, b)==1){ reverse(r.n, r.len); reverse(b.n, b.len); r = sub(r, b); reverse(r.n, r.len); index++; } c.n[i] = index; } } // 处理开头 b.n-1 个0 ,循环左移 while(c.n[0]==0 && c.len>1){ int k; for(k=0; k<c.len-1; k++) c.n[k] = c.n[k+1]; c.len--; } return c; }
根据上边的思路,我们需要将char型数组转化为int型数组,而且是倒序,这样保证从个位开始对齐,方便加减乘运算,而除法只需要将char型数组转化为int型数组就可。当然还有一些其他的工具,比如比较两个bigNum的大小,这在减法和除法上需要用到,还有除法采用的是减法思想,所以除法的数组顺序也要有个调整。
以上就是“如何用c语言编写大数四则运算(用c语言编写简单的四则运算)”的详细内容,想要了解更多C语言教程欢迎持续关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9345/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料