Что не так в моем коде по проблеме № 1021 (новичок) в URI Online Judge? - PullRequest
0 голосов
/ 25 января 2019

Я пишу код для проблемы URI онлайн-судьи № 1021 (для начинающих), но там написано Неправильный ответ (100%).Я не могу понять, что не так в моем коде!

#include <stdio.h>
#include <math.h>
int main()
{
    double input;
    scanf("%lf",&input);

    int note_100= input/100;
    int note_50=(fmod(input,100))/50;
    int note_20=(fmod((fmod(input,100)),50))/20;
    int note_10=(fmod((fmod((fmod(input,100)),50)),20))/10;
    int note_5=(fmod((fmod((fmod((fmod(input,100)),50)),20)),10))/5;
    int note_2=(fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5))/2;
    int note_1=(fmod((fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5)),2))/1;
    int note50=(fmod((fmod((fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5)),2)),1))/0.50;
    int note25=(fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5)),2)),1)),0.50))/0.25;
    int note10=(fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5)),2)),1)),0.50)),.25))/0.10;
    int note05=(fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5)),2)),1)),0.50)),0.25)),0.10))/0.05;
    int note01=(fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod((fmod(input,100)),50)),20)),10)),5)),2)),1)),0.50)),0.25)),0.10)),0.05))/0.01;

    printf("NOTAS:\n");
    printf("%d nota(s) de R$ 100.00\n",note_100);
    printf("%d nota(s) de R$ 50.00\n",note_50);
    printf("%d nota(s) de R$ 20.00\n",note_20);
    printf("%d nota(s) de R$ 10.00\n",note_10);
    printf("%d nota(s) de R$ 5.00\n",note_5);
    printf("%d nota(s) de R$ 2.00\n",note_2);
    printf("MOEDAS:\n");
    printf("%d moeda(s) de R$ 1.00\n",note_1);
    printf("%d moeda(s) de R$ 0.50\n",note50);
    printf("%d moeda(s) de R$ 0.25\n",note25);
    printf("%d moeda(s) de R$ 0.10\n",note10);
    printf("%d moeda(s) de R$ 0.05\n",note05);
    printf("%d moeda(s) de R$ 0.01\n",note01);
    return 0;
}

Ссылка на проблему: https://www.urionlinejudge.com.br/judge/en/problems/view/1021

1 Ответ

0 голосов
/ 25 января 2019

Код пытается выполнить точное целое число, например, математическое, со значениями, такими как 0,01, которые нельзя точно представить типичными double.Это часто приводит к неожиданным результатам.

Изменение на целые числа наименьшей единицы.(Масштаб 100)

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

#include <math.h>
#include <stdio.h>

int main(void) {
    double input;
    scanf("%lf",&input);
    long long cent = llround(input * 100);  // scale by 100 and round

    long long note_100 = cent/10000;  // divide by scaled amount (100*100)
    cent %= 10000;
    int note_50 = cent/5000;
    cent %= 5000;
    int note_20 = cent/2000;
    cent %= 2000;
    ...
    printf("NOTAS:\n");
    printf("%lld nota(s) de R$ 100.00\n", note_100);
    printf("%d nota(s) de R$ 50.00\n", note_50);
    printf("%d nota(s) de R$ 20.00\n", note_20);
    ...
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...