Операция сложения и вычитания массивов (Big int) - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблемы с работой с большими целыми числами (10 ^ 8 и 10 ^ 16 (сумма чисел между интервалами)). Мой текущий код не A C. Я полагаю, он получает одобрение 80/100 из-за переполнения лимита? Есть ли другие способы избежать операций с массивами? Если нет, то как мне решить следующую проблему с сложением и вычитанием массива?

Проблема: Тасним приезжает в Динаджпур, который очень известен производством личи. Сегодня она приходит в сад личи и замечает странную вещь. Владелец сада поместил личи в ведра разных размеров, расположенных в ряд так, чтобы каждое следующее ведро содержало ровно на одну личи больше, чем предыдущее. Она также узнает, что самое маленькое ведро содержит ровно M личи, а самое большое ведро содержит ровно N личи. Тасним очень любопытно узнать общее количество личи, которое есть во всех ведрах. Но она не настолько знаток математики. Более того, она также не знает, сколько там ведер. Итак, она просит вашей помощи. Теперь ваша задача - помочь Тасниму определить количество ведер, а также общее количество личи, которые содержат ведра.

Позвольте привести пример: самое маленькое ведро имеет ровно 5 личи, а самое большое имеет ровно 11. Итак, в 7 ведрах всего 5 + 6 + 7 + 8 + 9 + 10 + 11 = 56 личи.

Вход Будет несколько тестовых случаев в каждый входной файл, где каждый тестовый пример содержит два целых числа, M и N (0 8 ), обозначая количество личи в наименьшем и наибольшем сегменте соответственно.

Входной файл будет завершен, когда M и N оба равны нулю (т. Е. 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;
}```

1 Ответ

1 голос
/ 28 апреля 2020

следующий предложенный код:

  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 );
    }
}

типичный прогон программы, с комментариями:

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