输入两个长整数(100位),实现加减运算,而且具有可扩充性
谁能回答,请帮帮忙 先谢谢了啊!
在c语言环境下实现长整数加减运算
答案:1 悬赏:0 手机版
解决时间 2021-04-11 13:11
- 提问者网友:我没有何以琛的痴心不悔
- 2021-04-11 09:17
最佳答案
- 五星知识达人网友:想偏头吻你
- 2021-04-11 10:52
下面的代码能够完成楼主的要求,仅做参考。
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // 大整数的最大位数
char n1[MAX_SIZE] = ""; // 第一个大整数
char n2[MAX_SIZE] = ""; // 第二个大整数
char n3[MAX_SIZE+1] = ""; // 两个大整数之和或差
void do_add();
void do_sub();
void main()
{
// 读入两个大整数
printf("n1=");
scanf("%s", n1);
printf("n2=");
scanf("%s", n2);
// 求和
do_add();
// 求差
do_sub();
}
void do_add()
{
int iLen1;
int iLen2;
int iCarry = 0; // 进位
int n = 0;
// 将两个大整数的各位依次求和
for(iLen1 = strlen(n1)-1, iLen2 = strlen(n2)-1; (iLen1 >= 0) && (iLen2 >= 0); iLen1--, iLen2--)
{
n3[n] = n1[iLen1] - '0' + n2[iLen2] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
for(; iLen1 >= 0; iLen1--)
{
n3[n] = n1[iLen1] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
for(; iLen2 >= 0; iLen2--)
{
n3[n] = n2[iLen2] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
// 输出大整数之和
printf("n1+n2=");
for(n--; n >= 0; n--)
{
printf("%d", n3[n]);
}
printf("\n");
}
void do_sub()
{
int iLen1;
int iLen2;
int iBorrow = 0; // 借位
int n = 0;
int sign = 0;
// 如果n2>n1,那么交换两者,并置符号位为负
iLen1 = strlen(n1);
iLen2 = strlen(n2);
if ((iLen2 > iLen1) || (iLen2 == iLen1) && (strcmp(n2, n1) > 0))
{
strcpy(n3, n1);
strcpy(n1, n2);
strcpy(n2, n3);
sign = -1;
}
// 将两个大整数的各位依次求差
for(iLen1 = strlen(n1)-1, iLen2 = strlen(n2)-1; (iLen1 >= 0) && (iLen2 >= 0); iLen1--, iLen2--)
{
n3[n] = n1[iLen1] - n2[iLen2] - iBorrow;
iBorrow = (n3[n] >= 0) ? 0 : 1;
if (n3[n] < 0)
{
n3[n] += 10;
}
n++;
}
for(; iLen1 >= 0; iLen1--)
{
n3[n] = n1[iLen1] - '0' - iBorrow;
iBorrow = (n3[n] >= 0) ? 0 : 1;
if (n3[n] < 0)
{
n3[n] += 10;
}
n++;
}
// 输出大整数之差
printf("n1-n2=");
if (sign == -1)
{
printf("-");
}
for(n--; n >= 0; n--)
{
printf("%d", n3[n]);
}
printf("\n");
}
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // 大整数的最大位数
char n1[MAX_SIZE] = ""; // 第一个大整数
char n2[MAX_SIZE] = ""; // 第二个大整数
char n3[MAX_SIZE+1] = ""; // 两个大整数之和或差
void do_add();
void do_sub();
void main()
{
// 读入两个大整数
printf("n1=");
scanf("%s", n1);
printf("n2=");
scanf("%s", n2);
// 求和
do_add();
// 求差
do_sub();
}
void do_add()
{
int iLen1;
int iLen2;
int iCarry = 0; // 进位
int n = 0;
// 将两个大整数的各位依次求和
for(iLen1 = strlen(n1)-1, iLen2 = strlen(n2)-1; (iLen1 >= 0) && (iLen2 >= 0); iLen1--, iLen2--)
{
n3[n] = n1[iLen1] - '0' + n2[iLen2] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
for(; iLen1 >= 0; iLen1--)
{
n3[n] = n1[iLen1] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
for(; iLen2 >= 0; iLen2--)
{
n3[n] = n2[iLen2] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
// 输出大整数之和
printf("n1+n2=");
for(n--; n >= 0; n--)
{
printf("%d", n3[n]);
}
printf("\n");
}
void do_sub()
{
int iLen1;
int iLen2;
int iBorrow = 0; // 借位
int n = 0;
int sign = 0;
// 如果n2>n1,那么交换两者,并置符号位为负
iLen1 = strlen(n1);
iLen2 = strlen(n2);
if ((iLen2 > iLen1) || (iLen2 == iLen1) && (strcmp(n2, n1) > 0))
{
strcpy(n3, n1);
strcpy(n1, n2);
strcpy(n2, n3);
sign = -1;
}
// 将两个大整数的各位依次求差
for(iLen1 = strlen(n1)-1, iLen2 = strlen(n2)-1; (iLen1 >= 0) && (iLen2 >= 0); iLen1--, iLen2--)
{
n3[n] = n1[iLen1] - n2[iLen2] - iBorrow;
iBorrow = (n3[n] >= 0) ? 0 : 1;
if (n3[n] < 0)
{
n3[n] += 10;
}
n++;
}
for(; iLen1 >= 0; iLen1--)
{
n3[n] = n1[iLen1] - '0' - iBorrow;
iBorrow = (n3[n] >= 0) ? 0 : 1;
if (n3[n] < 0)
{
n3[n] += 10;
}
n++;
}
// 输出大整数之差
printf("n1-n2=");
if (sign == -1)
{
printf("-");
}
for(n--; n >= 0; n--)
{
printf("%d", n3[n]);
}
printf("\n");
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯