如何用c语言编写大数四则运算(用c语言编写简单的四则运算)

网友投稿 306 2022-06-13


如何用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.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.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

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

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

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

if(a.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

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

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

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

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

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.n[k] = c.n[k+1];

c.len--;

}

return c;

}

根据上边的思路,我们需要将char型数组转化为int型数组,而且是倒序,这样保证从个位开始对齐,方便加减乘运算,而除法只需要将char型数组转化为int型数组就可。当然还有一些其他的工具,比如比较两个bigNum的大小,这在减法和除法上需要用到,还有除法采用的是减法思想,所以除法的数组顺序也要有个调整。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python编程如何求解一元二次方程的复根?(python编写程序求解一元二次方程的根)
下一篇:资源||从入门到精通,超全Python资料分享!(零基础学python从入门到精通.pdf)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~