【发布时间】:2020-04-26 22:59:03
【问题描述】:
我在处理大整数(10^8 和 10^16(区间之间数字的总和))时遇到了麻烦。我当前的代码不是 AC。它得到了 80/100 的接受,我猜是因为限制溢出?还有其他方法可以避免数组操作吗?如果不是,请问如何解决以下数组加减法的问题?
问题: 塔斯尼姆来到以荔枝生产而闻名的迪纳杰布尔。今天,她来到一个荔枝园,发现一件奇怪的事。果园主人将荔枝放入不同大小的桶中,并排成一排,这样每一个桶中的荔枝都比前一个桶多一个。她还了解到,最小的桶正好包含 M 个荔枝,最大的桶正好包含 N 个荔枝。塔斯尼姆很好奇,想知道所有桶里的荔枝总数。但是,她在数学方面并不是那么专家。而且,她也不知道有多少桶。所以,她在寻求你的帮助。现在,你的任务是帮助 Tasnim 确定桶的数量以及桶中的荔枝总数。
举个例子,最小的桶正好有 5 个荔枝,最大的正好有 11 个。所以,7 个桶总共有 5 + 6 + 7 + 8 + 9 + 10 + 11 = 56 个荔枝.
输入 每个输入文件中会有多个测试用例,每个测试用例包含两个整数,M和N(0 8),分别表示最小和最大桶中荔枝的个数分别。
当 M 和 N 都等于 0(即 M 为 0,N 为 0)时,输入文件将被终止,每个输入文件最多包含 100 个测试用例。
输出 对于每种情况,打印桶数和荔枝总数,以空格分隔。不要忘记为每个测试用例打印一个空行。 我的代码:
#include <stdio.h>
#include<string.h>
int main(){
long unsigned int m,n,i=0,num,x=0, total;
while(x<100){
scanf("%lu %lu",&m,&n);
if(m==0 && n==0){
break;
}
else{
num=(n+1)-m;
total=(num*(m+n))/2;
printf("%lu %lu\n",num,total);
}
x++;
}
return 0;
}```
【问题讨论】:
-
为什么不尝试使用
uint64_t而不是long unsigned int?请记住,long unsigned int取决于您使用的编译器。要使用uint64_t,您需要使用include <stdint.h>标头。 -
您不需要 bigint 来处理 10^8 和 10^16,64 位
int将处理 10^19。不要假设任何平台都会使用 64 位的long,最低为 32 位。至于解决挑战问题 - 很抱歉很苛刻,但选择解决它的是你。如果您不能,请转到另一个。在这里倾倒整个问题陈述是没有用的,因为任何有兴趣解决它的人都会直接进入挑战站点,而不是给你,尽管人们会尝试回答有关 C 的特定问题,而不是“为什么我的解决方案不起作用” ? -
关于;
while(x<100){这个循环完全不需要,只要使用M==0 && N ==0条件退出循环即可
标签: c int overflow biginteger