Форум программистов, компьютерный форум CyberForum.ru

Монеты. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
BOR1K
 Аватар для BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
26.11.2009, 19:03     Монеты. #1
Имеется по одной монете следующих достоинств: 1, 2, 3, 5, 10, 15, 25, 50, 100, 500, 1000, 2500, 5000, 10000. Можно ли набрать из этих монет заданную сумму. Указать, как это сделать.

Входные данные: целое положительное число n – денежная сумма.

Выходные данные: ответ в виде "Можно"\"Нельзя , варианты разложения суммы на монеты, если это возможно .

Все варианты перебрал, даже алгоритм не могу составить.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 19:07     Монеты. #2
а ты в алгоритмах пошарь, там один в один была задача. или на фрилансе, помню Odip всё рассуждал. но такое точно было.
начинать там надо как всегда с максимального номинала и постепенно уменьшать.
язык назови, подумаю на досуге

Добавлено через 43 секунды
и у тебя ответ всегда будет можно, так как есть минимальный номинал: 1
BOR1K
 Аватар для BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
26.11.2009, 19:12  [ТС]     Монеты. #3
По одной монете. Язык си.

Добавлено через 3 минуты
можно число делить, на номиналы кот меньше его, и если остатока нет, то норм)) вроде так.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 19:19     Монеты. #4
а вот тебе на быструю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
 
int main()
{
    const unsigned long nominal[] ={ 1, 2, 3, 5, 10, 15, 25, 50, 100, 500, 1000, 2500, 5000, 10000 };
    
    unsigned long sum;
    cout<<"Enter your sum: "; cin>>sum;
 
    while (sum)
    {
        for (int i=sizeof(nominal)/sizeof(nominal[0]); --i>=0;)
        {
            if(sum>=nominal[i]) {cout<<nominal[i]<<endl; sum-=nominal[i]; break;}
        }
    }
 
    system("pause");
    return 0;
}
Добавлено через 1 минуту
про язык не успел увидеть

Добавлено через 1 минуту
но там всё прочто. cout на printf, cin - scanf, ну и шапку поправить

можно и делить, это как оптимизация. можно много чего придумать. я не утверждаю что это лучший вариант, даже наоборот
BOR1K
 Аватар для BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
26.11.2009, 19:47  [ТС]     Монеты. #5
Чет решения понять немогу, зачем бесконечный цикл делать
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 19:52     Монеты. #6
где там бесконечный?

while (sum) будет выполняться пока sum не равно нулю. а в результате работы строчки 18 sum рано или поздно обратиться в 0.

но лучше рассмотри вариант с делением, особенно если тебе надо выводит какое количетсво монет какого номинала используется
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
26.11.2009, 20:58     Монеты. #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 using namespace std;
 int main()
{
        const unsigned long nominal[] ={ 1, 2, 3, 5, 10, 15, 25, 50, 100, 500, 1000, 2500, 5000, 10000 };
        int mas[14], i=0, j, temp, b=1;
        unsigned long sum;
        cout<<"Enter your sum: "; cin>>sum;
        while(nominal[i]<sum && i<14)
            i++;
        mas[0]=nominal[i-1];
        temp=mas[0];
        for(j=i-2; j>=0 && temp!=sum; j--)
        {
            if(temp+nominal[j]<=sum)
            {
                mas[b]=nominal[j];
                b++;
                temp+=mas[b-1];
            }
        }
        if(temp!=sum)
            cout<<"Nelzy"<<endl;
        else
        {
            cout<<"Mogno"<<endl;
            for(i=0; i<b; i++)
                cout<<mas[i]<<endl;
        }
 
        system("pause");
        return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
27.11.2009, 02:34     Монеты. #8
Цитата Сообщение от TanT Посмотреть сообщение
особенно если тебе надо выводит какое количетсво монет какого номинала используется
Там же в задании по одной монете каждого достоинства...

Вот так ещё посчитать можно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
 
/*
    Имеется по одной монете следующих достоинств: 1, 2, 3, 5, 10, 15, 25, 50, 100, 500, 1000, 2500, 5000, 10000. 
    Можно ли набрать из этих монет заданную сумму.
*/
 
#define NUM_COINS 14
 
int main(void){
    int have_coins[NUM_COINS] = { 10000, 5000, 2500, 1000, 500, 100, 50, 25, 15, 10, 5, 3, 2, 1 };
    int used_coins[NUM_COINS] = { 0 };
    int *pHcoin, *pUcoin, sum, left;
    
    printf("Enter sum needed: ");
    scanf("%d", &sum); 
    if ( sum <= 0 ){
        printf("Wrong data!\n");
        return 1;
    }
    
    for ( pHcoin = have_coins, pUcoin = used_coins, left = sum; pHcoin < have_coins + NUM_COINS; pHcoin++ ){
        if ( !left ) /* сумма набрана */
            break;
        if ( left - *pHcoin >= 0 ){
            *pUcoin++ = *pHcoin;
            left -= *pHcoin;
        }
    }
    
    if ( left )
        printf("Unreal to collect the necessary sum, sorry\n");
    else{
        printf("The sum of %d collecting by coins:\n", sum);
        for ( left = 0; left < NUM_COINS; left++ ){
            if ( !used_coins[left] )
                break;
            printf("%d ", used_coins[left]);
        }
        putchar('\n');
    }
    
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
27.11.2009, 04:43     Монеты. #9
Цитата Сообщение от easybudda Посмотреть сообщение
for ( pHcoin = have_coins, pUcoin = used_coins, left = sum; pHcoin < have_coins + NUM_COINS; pHcoin++ ){
if ( !left ) /* сумма набрана */
break;
if ( left - *pHcoin >= 0 ){
*pUcoin++ = *pHcoin;
left -= *pHcoin;
}
}
вот так
C
1
2
3
4
5
6
7
8
    for ( pHcoin = have_coins, pUcoin = used_coins, left = sum; pHcoin < have_coins + NUM_COINS; pHcoin++ ){
        if ( left - *pHcoin >= 0 ){
            *pUcoin++ = *pHcoin;
            left -= *pHcoin;
        }
        if ( !left ) /* сумма набрана */
            break;
    }
всё-таки немного правильнее, хотя и не принципиально
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
27.11.2009, 12:17     Монеты. #10
Это где вы монеты по 10000 руб видели ?
В форуме уже решали примерное аналогичную задачу.
Там еще нужно было очень быстро посчитать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2009, 12:34     Монеты.
Еще ссылки по теме:

Генератор броска монеты C++
Кузнечик, собирающий монеты C++
Программа - Имитация подбрасываний монеты. Что не так? C++
C++ Разделить монеты между заданным количеством людей
C++ Задача про монеты

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
27.11.2009, 12:34     Монеты. #11
Цитата Сообщение от odip Посмотреть сообщение
Это где вы монеты по 10000 руб видели ?
Одна из них к нему значит попала
http://www.bankirsha.com/monety-ross...00-rublei.html
Yandex
Объявления
27.11.2009, 12:34     Монеты.
Ответ Создать тему
Опции темы

Текущее время: 05:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru