В каждом из следующих проектов есть одна ошибка (мне нужно их исправить) - PullRequest
0 голосов
/ 09 ноября 2018

В каждом из следующих проектов есть одна ошибка (мне нужно их исправить). В первом проекте код не работает для больших значений n, а во втором я понятия не имею, почему программа не работает должным образом. Функция toDecimal работает нормально, проблема в том, что если я хочу прочитать 1-значное число, программа остановится и на экране появится 10: s. Я прошу немного помощи и оптимизации, спасибо за ваше время.

//prints the number of primes <= n < 10^5
#include <stdio.h>

int primes[100000];
int main(void)
{
    int n, nrp = 0;
    scanf("%d",&n);
    for(int p=2; p<=n; p++)
    {
        if (primes[p]==0)
        {
            nrp++;
            for(int x=p*p; x<=n; x+=p)
                primes[x] = 1;
        }
    }
    printf("number of primes: %d", nrp);
    return 0;
}



//converts a hexadecimal number with k<=10 digits to decimal
#include <stdio.h>

int toDecimal(char c)
{
    if ( 'a' <= c && c <= 'f' )
        return c-'a'+10;
    if ( 'A' <= c && c <= 'F' )
        return c-'A'+10;
    if ( '0' <= c && c <= '9' )
        return c-'0';
}

int main(void)
{
    char c='x';
    int k = 0;
    long long nr = 0;
    printf("Number of digits: ");
    scanf("%d",&k);
    for(int i=0; i<k; i++)
    {
        scanf("%c",&c);
        nr = 16*nr + toDecimal(c);
    }
    printf("\n%lld\n", nr);
    return 0;
}

1 Ответ

0 голосов
/ 09 ноября 2018

В первой программе int x = p*p; переполнится, когда p будет достаточно большим.

Во втором случае ваш scanf читает символ новой строки (c = 10), а ваша функция toDecimal не имеет защиты для недопустимых символов, поэтому она возвращает данные мусора. Результат неверен для каждого ввода, независимо от количества цифр. Вместо этого используйте scanf(" %c",&c); (обратите внимание на пробел), чтобы исправить это. Это заставит его игнорировать что-либо перед фактическим персонажем. В любом случае вам нужно внести серьезные изменения в код, чтобы проверить наличие недопустимых входных данных, плюс нет проверки на nr, потенциально переполненной, если вы введете достаточно большое число.

Также, пожалуйста, узнайте, как использовать отладчик. Чтобы понять это, потребовалось буквально 5 секунд, достаточно времени, чтобы установить точку останова и сделать пару шагов.

...