【问题标题】:Addition and substracting operation of arrays (Big int)数组的加减运算(Bigint)
【发布时间】: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 &lt;stdint.h&gt; 标头。
  • 您不需要 bigint 来处理 10^8 和 10^16,64 位 int 将处理 10^19。不要假设任何平台都会使用 64 位的long,最低为 32 位。至于解决挑战问题 - 很抱歉很苛刻,但选择解决它的是你。如果您不能,请转到另一个。在这里倾倒整个问题陈述是没有用的,因为任何有兴趣解决它的人都会直接进入挑战站点,而不是给你,尽管人们会尝试回答有关 C 的特定问题,而不是“为什么我的解决方案不起作用” ?
  • 关于; while(x&lt;100){这个循环完全不需要,只要使用M==0 && N ==0条件退出循环即可

标签: c int overflow biginteger


【解决方案1】:

以下建议的代码:

  1. 干净编译
  2. 使用 64 位无符号整数
  3. 执行所需的功能
  4. 记录包含每个头文件的原因
  5. 遵循公理:每行只有一个语句,并且(最多)每个语句有一个变量声明。

现在,建议的代码:

#include <stdio.h>    // scanf(), printf()
#include <stdint.h>   // uint64_t
#include <inttypes.h> // SCNu64, PRNu64

int main( void )
{
    uint64_t m;
    uint64_t n;
    uint64_t num;
    uint64_t total;

    while( scanf( "%" SCNu64 "%" SCNu64, &m, &n ) == 2 )
    {
        if( m==0 && n==0)
        {
            break;
        }

        num=(n+1)-m;
        total=(num*(m+n))/2;
        printf("%" PRIu64 "%" PRIu64 "\n\n", num, total );
    }
}

程序的典型运行,使用 cmets:

10 1000     << entered data for 1 test case
991 500455  << program output
            << blank line between test cases
0 0         << terminating entered data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多