大数求和
标签(空格分隔): OJ_算法
题目二[大数求和]
描述:
给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B;
题目类别: 字符串
难度: 中级
运行时间限制: 10Sec
内存限制: 128MByte
阶段: 入职前练习
输入:
因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。
输出:
以字符串形式,输出一行,表示A和B的和。
样例输入:
11111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222
样例输出:
33333333333333333333333333333333333333333333333333
代码
#include<stdio.h>
#include<string.h>
#define N 101
void BigNumSum(char* num1, char* num2, char* sum)
{
int len1 = strlen(num1);
int len2 = strlen(num2);
int sum_bit_h = 0;
int sum_bit = 0;
memset(sum, 0, N*sizeof(char));
for (int i = len2; i > 0; i--)
{
if (i - len2 + len1 - 1 >= 0)
sum_bit = num1[i - len2 + len1 - 1] - '0' + num2[i - 1] - '0' + sum_bit_h;
else
sum_bit = num2[i - 1] - '0' + sum_bit_h;
sum[i] = sum_bit%10 + '0';
sum_bit_h = sum_bit / 10;
}
sum[0] = (char)(sum_bit_h + '0');
}
int main()
{
char num1[N], num2[N], sum[N];
gets(num1);//这种读取方式可以通过
gets(num2);
/*fgets(num1, sizeof(num1), stdin);//在华为OJ上,使用这种读取方式运行不通过,求解释?
fgets(num2, sizeof(num2), stdin);
int len1 = strlen(num1);
num1[len1 - 1] = '\0';
int len2 = strlen(num2);
num2[len2 - 1] = '\0';*/
if (strlen(num1) < strlen(num2))
BigNumSum(num1, num2, sum);
else
BigNumSum(num2, num1, sum);
int i = 0;
while (sum[i] == '0')
i++;
printf("%s\n", sum+i);
return 0;
}
存在的问题:gets读入数据在华为OJ上可以通过,fgets不能通过;?为什么?求告知?
本文探讨了大数相加的问题,给定50至100位的大整数A和B,要求计算它们的和C。题目属于字符串处理的中级难度,时间限制为10秒,内存限制为128MB。在输入部分,大数以字符串形式给出,输出同样以字符串返回。示例展示了两个极值案例。在实现过程中,发现使用`gets`在华为在线评测系统上能正确运行,但`fgets`却无法通过,作者提出了这个问题并寻求解答。参考链接提供了相关讨论。
877

被折叠的 条评论
为什么被折叠?



