Нет выходных данных для проблемы 8 проекта euler - PullRequest
0 голосов
/ 24 сентября 2019

Это проблема 8 проекта euler .

Я не понимаю, почему не отображается вывод.Пожалуйста, не пишите прямого решения, я просто не хочу знать, где моя логика неверна.

    #include <stdio.h>

int main() {
    //code

    char a[1001]='7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450';

    int p,i=0,m;
    for(p=1;i<13;i++)p=p*((int)a[i]-48);m=p;printf("%d %d\n",m,p);
    for(;i<1001&&a[i]!='\0';i++)
    {
        p=p/((int)(a[i-13]-48));
        p=p*((int)(a[i]-48));
        if(m<p)m=p;
    }
    printf("%d\n",m);
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019

Вы должны изменить char a[1001] = '123'; на char a[] = "123";, а затем запустить его. Вот код

#include <stdio.h>

int main() {
    //code
    //' ' is used for single character, " " is for string.
    char a[]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";

    int p, i=0, m;

    for(p=1;i<13;i++)
    {
        p = p * ( (int)a[i] - 48);
        m = p;
        printf("%d %d\n", m, p);
    }
    for( ; i < (1001 && a[i]!='\0'); i++)
    {
        p= p / ((int)(a[i-13] - 48));
        p= p * ((int)(a[i] - 48));
        if(m < p)
            m = p;
    }
    printf("%d\n",m);
    return 0;
}

output -:
7 7
21 21                                                                                                                          
126 126                                                                                                                        
882 882                                                                                                                        
882 882                                                                                                                        
6174 6174  
37044 37044                                                                                                                    
185220 185220                                                                                                                  
555660 555660                                                                                                                  
555660 555660 
5000940 5000940                                                                                                                
5000940 
2 голосов
/ 24 сентября 2019

В опубликованном коде есть некоторые ошибки, как синтаксические, так и логические.

Как уже отмечалось, вы должны использовать двойные кавычки для строкового литерала.Вы также можете написать его разделенным на разные строки, компилятор объединит все чанки и добавит терминатор \0.

const char *digits = "73167176531330624919225119674426574742355349194934"
                      // ...
                     "71636269561882670428252483600823257530420752963450";

Тип int может быть слишком маленьким, чтобы представлять значение продукта,Стандарт только гарантирует, что он способен представлять числа до 32767 и даже 32-разрядный (обычно в наши дни) int не может хранить 9 13 .Я бы предложил использовать long long и более значимые имена, например:

#define MAX_ADJACENT_DIGITS 13
// ...
long long product = 0, max_product = 0;
int n_digits = 0;

Ошибка в вашем алгоритме заключается в том, что он не учитывает, что происходит, когда цифра равна нулю.Целочисленное деление на ноль может привести к ошибке времени выполнения, и, кроме того, все произведения соседних цифр равны нулю.

Рассмотрим эту модифицированную версию:

  • Для каждого символа в строке, от первого до того, который равен '\0'

    • Если он равен '0' (обратите внимание на одинарные кавычки и использованиефактический символ, а не «магическое» число)

      • сброс product и n_digits.
      • Пропустить остаток тела цикла (continue;).
    • Если это первая цифра группы смежных цифр (n_digits == 0)

      • чем product равно этой цифре, и мы можем увеличить n_digits.
      • Продолжить со следующей цифрой.
    • Здесь мы можем обновить продукт (product *= digits[i] - '0';) и увеличить n_digits.

    • Если мы превысили максимальное количество соседних цифр

      • , удалите самую старую (product /= digits[i - MAX_ADJACENT_DIGITS] - '0';) из продукта и сбросьте n_digits на максимум.
      • Обновите максимальное значение продуктов, если текущий продукт больше.

После этих шагов ваша программа должна найти подпоследовательностьцифр "5576689664895" и вывод их произведения.

2 голосов
/ 24 сентября 2019

У вас неверные кавычки в инициализаторе char a[1001] - одинарные кавычки предназначены для символьной константы , используйте двойные кавычки для строкового литерала .И получите лучшую среду компиляции - такую, которая предупреждает о таких ошибках.

Тогда идея удаления фактора с тринадцатого до последнего из текущего продукта кажется умной на первый взгляд, но она ломается, если цифраноль, и вы пытаетесь разделить на него.

0 голосов
/ 30 сентября 2019

Это мой подход к решению эйлера № 8.Сначала он использует функцию strok(3) для разделения всей строки на части, разделенные символами 0.Затем он перемещает окно длиной n по разделенным строкам (строки длиной менее n не могут получить достаточно цифр, чтобы сформировать продукт без использования 0, поэтому они отбрасываются.

Затем мысоздайте первый продукт, умножив первый набор цифр n. После того, как он установлен, окно разбивается на части, путем умножения продукта на следующую цифру и деления продукта на последнюю цифру в очереди, указанную на pи q. Продукты сравниваются с максимумом и, если они больше, сохраняются положение совпадения и новое значение продукта.

В конце печатается подстрока, начиная ссохраненная позиция, индекс распечатывается и продукт.

Программа принимает опции -n и -v:

  • -n число позволяет указать другое число (по умолчанию 13, как указывает euler # 8)
  • -v производит больше выходных данных, указывая на каждом шаге тестируемую строку, и tВовлеченные продукты.

Чтобы скомпилировать программу, просто:

cc -o 8 8.c

и для ее запуска просто выполните 8 в командной строке.

Если вы не хотите видеть решение, не продолжайте читать.


8.c

#include <getopt.h>
#include <stdio.h>
#include <string.h>

#define FLAG_VERBOSE    (1 << 0)

int flags = 0;

int n = 13;
char N[] = 
                "73167176531330624919225119674426574742355349194934"
                "96983520312774506326239578318016984801869478851843"
                "85861560789112949495459501737958331952853208805511"
                "12540698747158523863050715693290963295227443043557"
                "66896648950445244523161731856403098711121722383113"
                "62229893423380308135336276614282806444486645238749"
                "30358907296290491560440772390713810515859307960866"
                "70172427121883998797908792274921901699720888093776"
                "65727333001053367881220235421809751254540594752243"
                "52584907711670556013604839586446706324415722155397"
                "53697817977846174064955149290862569321978468622482"
                "83972241375657056057490261407972968652414535100474"
                "82166370484403199890008895243450658541227588666881"
                "16427171479924442928230863465674813919123162824586"
                "17866458359124566529476545682848912883142607690042"
                "24219022671055626321111109370544217506941658960408"
                "07198403850962455444362981230987879927244284909188"
                "84580156166097919133875499200524063689912560717606"
                "05886116467109405077541002256983155200055935729725"
                "71636269561882670428252483600823257530420752963450";

int main(int argc, char **argv)
{
    int opt;
    while ((opt = getopt(argc, argv, "n:v")) != EOF) {
        switch (opt) {
        case 'n':
            if (sscanf(optarg, "%d", &n) != 1) {
                fprintf(stderr,
                        "invalid number: %s\n",
                        optarg);
            }
            break;
        case 'v':
            flags |= FLAG_VERBOSE;
            break;
        } /* switch */
    } /* while */

    if (flags & FLAG_VERBOSE) {
        printf( "n = %d;\n"
                "N = \"%s\"\n",
                n, N);
    }

    char *p, *res = NULL;
    unsigned long long res_prod = 0;
    for (p = strtok(N, "0"); p; p = strtok(NULL, "0")) {
        if (strlen(p) < n) continue;
        char *q = p;
        unsigned long long prod = 1LL;
                int i;
        for (i = 0; i < n; i++) { /* initial product */
            prod *= *p++ - '0';
        }
        for(;;) {
            int larger = prod > res_prod;
            if (flags & FLAG_VERBOSE)
                printf("Trying %.*s ==> %llu%s\n",
                        n, q, prod,
                        larger ? " !" : "");
            if (larger) {
                res = q; res_prod = prod;
            }
            if (!*p) break;
            prod /= *q++ - '0';
            prod *= *p++ - '0';
        }
    }
    if (res) {
        int pos = res - N;
        printf("Largest product at position %d (%s%.*s%s): %llu\n",
               pos,
               pos ? "..." : "", n, res,
               pos < sizeof N - 1 - n ? "..." : "",
               res_prod);
    } else {
        printf("No solution found\n");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...