大整数运算器 c语言思路,大整数相加的实现思路

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。比如下面问题:

9876543210 + 1234567890 =?

让字符串 num1 = "9876543210",字符串 num2 = "1234567890",结果保存在字符串result中。要求编程实现上述高精度的十进制加法。

#include

#include

int NumAdd(const char *first,const char *second,char *result, int resultlen)

{

int numlen[2];

numlen[0] = strlen(first);

numlen[1] = strlen(second);

int maxlen;

maxlen= numlen[0]> numlen[1] ? numlen[0] : numlen[1] ;

if (resultlen< maxlen + 1)

return -1;

int n;

int byteValue[2];

int curByteResult;

int addByteResult;

curByteResult=addByteResult=0;

//从左到右进行循环

for(n = 0; n

{

--numlen[0];

--numlen[1];

if (numlen[0] >= 0)

byteValue[0] = first[n] - '0' ;

else

byteValue[0] = 0 ;

if (numlen[1] >= 0)

byteValue[1] = second[n]- '0' ;

else

byteValue[1] = 0 ;

curByteResult = byteValue[0] + byteValue[1];

if (curByteResult>=10)

{

curByteResult -= 10;

addByteResult = 1;

if (n==0)

{

result[0] = '1';

++result;

}

else

{

++result[n-1]; //处理进位

}

result[n] = '0'+curByteResult;

}

else

{

result[n] = '0'+curByteResult ;

addByteResult = 0;

}

}

result[n] =0;

return 1;

}

int main( )

{

char szstr1[]="9876543210";

char szstr2[]="1234567890";

char result[100];

NumAdd(szstr1,szstr2,result,100);

printf("result is %s ",result);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大整数减法的思路和小学数学中的减法一样,从个位开始逐位相减,如果被减数小于减数,则向高位借位。具体实现过程如下: 1. 将两个大整数转换成相同长度,可以在较短的整数前面补0,使得两个整数的位数相同。 2. 从末位开始逐位相减,如果被减数小于减数,则向高位借位,借位后被减数加上10。 3. 将相减后的结果存入结果数组中。 4. 最后,将结果数组中的数反向输出,即为减法的结果。 以下是 C 语言实现大整数减法运算的示例代码: ```c #include <stdio.h> #include <string.h> #define N 1000 void reverse(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } } int main() { char a[N], b[N], res[N]; int lena, lenb, len; int i, j, k, borrow; printf("请输入被减数:"); scanf("%s", a); printf("请输入减数:"); scanf("%s", b); lena = strlen(a); lenb = strlen(b); // 将较短的整数前面补0,使得两个整数的位数相同 if (lena < lenb) { for (i = lena - 1; i >= 0; i--) { a[i + lenb - lena] = a[i]; } for (i = 0; i < lenb - lena; i++) { a[i] = '0'; } len = lenb; } else { for (i = lenb - 1; i >= 0; i--) { b[i + lena - lenb] = b[i]; } for (i = 0; i < lena - lenb; i++) { b[i] = '0'; } len = lena; } // 从末位开始逐位相减 borrow = 0; for (i = len - 1; i >= 0; i--) { k = a[i] - b[i] - borrow; if (k < 0) { k += 10; borrow = 1; } else { borrow = 0; } res[i] = k + '0'; } // 去掉结果前面的0,并将结果反向输出 i = 0; while (res[i] == '0' && i < len - 1) { i++; } for (j = i; j < len; j++) { printf("%c", res[j]); } printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值