Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
vittenberg
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23
#1

Найти все трехзначные числа, сумма цифр которых равна заданному целому числу

15.01.2015, 23:03. Просмотров 2736. Ответов 16
Метки нет (Все метки)

Задача: Найти все трехзначные числа, сумма цифр которых равна данному целому числу
Решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>;
void main()
{
    using namespace std;
    setlocale(LC_ALL, "rus");
    int i, digit, hun, dec, one;
    cout << "Введите число: ";
    cin >> digit;
    for (i = 100; i < 1000; i++);
    {
        hun = i / 100;
        dec = i % 100 / 10;
        one = i % 10;
        if ((hun + dec + one) == digit) cout << i << "\n";
        
    }
}
При первой же итерации i принимает значение 1000. Никак не могу понять почему?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2015, 23:03
Ответы с готовыми решениями:

Найти все трехзначные числа, сумма цифр которых равна данному целому числу
Найти все трехзначные числа?сумма цифр которых равна данному целому числу!...

Найти все трехзначные десятичные числа, сумма цифр которых равна заданному числу
По введенным целым числом М распечатать все трехзначные десятичные числа, сумма...

Найти и распечатать все трехзначные числа, сумма цифр которых равна вводимому с клавиатуры числу
2. Найти и распечатать все трехзначные числа, сумма цифр которых равна...

Вывести все трехзначные десятичные числа, сумма цифр которых равна введенному пользователем числу
Нужно вывести все трехзначные десятичные числа, сумма цифр которых равна...

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

16
Pumie
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.01.2015, 23:27 #2
Нахождение dec неверное.

Вот, например.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main ()
{
    cout<<"Enter your digit ";
    int digit;
    cin>>digit;
    int hun, dec, ed;
    for (int i=100; i<1000; i++)
    {
        hun=i/100;
        dec=(i/10)%10;
        ed=i%10;
        if ((hun+dec+ed)==digit) cout<<i<<endl;
    }
}
0
casper007
69 / 69 / 58
Регистрация: 12.12.2013
Сообщений: 420
15.01.2015, 23:29 #3
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Цитата Сообщение от vittenberg Посмотреть сообщение
for (i = 100; i < 1000; i++);
Потому что вы закрыли тело цикла после его объявления
1
vittenberg
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23
15.01.2015, 23:43  [ТС] #4
спасибо огромное!
0
ValeryS
Модератор
7211 / 5474 / 681
Регистрация: 14.02.2011
Сообщений: 18,520
15.01.2015, 23:45 #5
Цитата Сообщение от Pumie Посмотреть сообщение
Нахождение dec неверное.
почему???
0
Pumie
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.01.2015, 23:50 #6
My bad.
Неверно прочла Ваш код.
0
ValeryS
Модератор
7211 / 5474 / 681
Регистрация: 14.02.2011
Сообщений: 18,520
15.01.2015, 23:51 #7
vittenberg,
есть и другое решение

C++
1
2
3
4
5
for(int i=1;i<10;i++)
 for(int j=0;j<10;j++)
  for(int k=0;k<10;k++)
    if((i+j+k)==digit)
     cout<<100*i+10*j+k;
количество итераций тоже самое, но избавляемся от медленных делений
1
vittenberg
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 23
16.01.2015, 01:22  [ТС] #8
ValeryS, интересное решение. Правда темы про вложенные циклы еще не было. Поэтому реализация такая
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
16.01.2015, 01:42 #9
ValeryS, есть и третье решение
C++
1
2
3
4
5
6
7
8
9
10
11
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Rus");
    int n; cout << "Введите сумму цифр числа:"; cin >> n;
    for (int i=max(1,n-18); i<=min(n,9); i++)
    for (int j=max(0,n-i-9); j<=min(n-i,9); j++)
        cout << i*100 + j*10 + n-i-j << ' ';
 
    system("pause");
    return 0;
}
и количество итераций гораздо меньше, и избавляемся от любых проверок в принципе.
2
The535
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
16.01.2015, 02:25 #10
Ну, или так можно сократить итерации.
C++
1
2
3
4
5
6
7
8
9
10
int digit;
    cin >> digit;
    for (int i = 1; i <= digit ; ++i) {
        for (int j = 0; j <= digit - i; ++j) {
            for (int k = 0; k <= (digit - i) - j; ++k) {
                if((i+j+k)==digit)
                    cout << 100 * i + 10 * j + k << ' ';
            }
        }
    }
Добавлено через 5 минут
Но предыдущий способ все равно быстрее.
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
16.01.2015, 03:35 #11
Обобщение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void r(int n, unsigned long long k, int d, int i0)
{
    if (d==1) cout << k*10+n << endl; else
    for (int i=max(i0,n-9*(d-1)); i<=min(n,9); i++) r(n-i, k*10+i, d-1, 0);
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Rus");
    int d, n; cout<<"Введите количество разрядов (>1) и сумму цифр числа: "; cin>>d>>n;
    r(n, 0, d, 1);
    system("pause");
    return 0;
}
0
ValeryS
Модератор
7211 / 5474 / 681
Регистрация: 14.02.2011
Сообщений: 18,520
16.01.2015, 10:06 #12
Цитата Сообщение от _Ivana Посмотреть сообщение
есть и третье решение
разумеется есть
как наверное и пятое и десятое
и можно устроить какой нибудь конкурс
как было с переворотом массива
ТС ответ уже получил,я его отметил как лучший ответ, но я думаю ему будет интересно как тривиальные задачи решаются разными способами не всегда очевидными
например так на вскидку вижу что сумма не должна быть больше 27 и меньше 1
при 1 одно решение 100
а при 27 -999
и не надо цикл крутить

потом может к Байту попадем с его http://www.cyberforum.ru/mathematics/thread1035225.html
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
16.01.2015, 10:14 #13
ValeryS, _Ivana, добавлю свои пять копеек. Нафига:
C++
1
cout<<100*i+10*j+k;
если можно просто:
C++
1
cout << i << j << k << '\n';
А в остальном, пожалуй, решение у _Ivana'а лучшее. Единственное, что следует подправить это проверку на диапазон для n [1, 27].
1
ValeryS
Модератор
7211 / 5474 / 681
Регистрация: 14.02.2011
Сообщений: 18,520
16.01.2015, 10:19 #14
Цитата Сообщение от The535 Посмотреть сообщение
Ну, или так можно сократить итерации.
ну давай посмотрим
сумма 27
первая цикл крутит 27 раз
второй от 26 до 1 в среднем 14
третий соответственно от 26 до 2 в среднем 13
27*13*14=4914
это несколько больше чем 1000
но самое главное это возможны неправильные решения
смотри
i=1 j=0 первые итерации двух циклов, k=26 последняя итерация
Цитата Сообщение от The535 Посмотреть сообщение
if((i+j+k)==digit)
1+0+26==27 истина, печатаем 1*100+10*0+27=127 что несколько неправильно

Добавлено через 1 минуту
Ilot,
если вывести на экран то да
а если это число необходимо где то сохранить?
например завтра условия изменятся и попросят сохранить все числа в массиве?
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
16.01.2015, 10:22 #15
Цитата Сообщение от ValeryS Посмотреть сообщение
Ilot,
если вывести на экран то да
а если это число необходимо где то сохранить?
ValeryS, вы лучше меня знаете, что проблемы решаются по мере их возникновения. Невозможно написать универсальный код. Но в данном случае вывода на консоль или в файл последний вариант предпочтительнее. Думаю вы со мной согласитесь.
0
ValeryS
Модератор
7211 / 5474 / 681
Регистрация: 14.02.2011
Сообщений: 18,520
16.01.2015, 10:34 #16
Цитата Сообщение от Ilot Посмотреть сообщение
Думаю вы со мной согласитесь
разумеется согласен
просто указал на еще одно разночтение
А так пускай знают что не всегда нужно число выводить можно и поразрядно
это как в жизни допустим диктуем номер телефона
можно "сто двадцать три" а можно "один два три", чем и хороша позиционная система

Добавлено через 5 минут
я вот думаю как сюда рекурсию пришпандорить

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
я вот думаю как сюда рекурсию пришпандорить
хотя у _Ivana, в 11 посте она есть, не заметил сначала
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
16.01.2015, 17:00 #17
Цитата Сообщение от Ilot Посмотреть сообщение
А в остальном, пожалуй, решение у _Ivana'а лучшее. Единственное, что следует подправить это проверку на диапазон для n [1, 27].
Зачем лишние проверки? Код и так их уже содержит в себе - можете запустить и убедиться. Причем, и первый и второй обобщенный рекурсивный вариант - только количество разрядов нужно > 1.

Добавлено через 2 минуты
Цитата Сообщение от Ilot Посмотреть сообщение
ValeryS, _Ivana, добавлю свои пять копеек. Нафига:
cout<<100*i+10*j+k;
если можно просто:
В варианте кода с циклом да, будет меньше операций. А в моем варианте с рекурсией придется либо стринг тащить в качестве параметра функции, что не способствует скорости, либо еще что подобное. Но зато в этом случае код может работать на достаточно длинных числах.
0
16.01.2015, 17:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2015, 17:00

Распечатать все трёхзначные числа, сумма цифр которых равна заданному натуральному числу
Очень Нужно Друзья!!! Буду благодарен при содействии. Распечатать все...

Найти все трехзначные числа, состоящие из разных цифр, сумма которых равна А
Найти все трехзначные числа, которые состоят из разных цифр, а их сумма ровна А...

Найти все трёхзначные числа, которые состоят из разных цифр, а их сумма равна заданному числу
Помогите решить в С++ 2.2 Найти все трехзначные числа, которые состоят из...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru