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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
l1qu1d
Сообщений: n/a
#1

Студенческая задачка C++ - C++

24.09.2009, 22:37. Просмотров 1811. Ответов 26
Метки нет (Все метки)

Доброго времени суток!
Извиняюсь, если подобный вопрос уже был на форуме, поиск и просмотр 20+ страниц мне результат не выдал, поэтому надеюсь на вашу помощь.
Суть, как говорится, такова :

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

Кому не трудно, черканите в эту тему, пожалуйста, как это будет выглядеть в C++.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2009, 22:37     Студенческая задачка C++
Посмотрите здесь:

C++ Описание класса "Студенческая группа"
C++ Описать класс "студенческая группа"
задачка c++ C++
C++ Задачка
C++ задачка с++
Задачка C++
C++ задачка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GennDALF
12 / 12 / 0
Регистрация: 24.09.2009
Сообщений: 61
24.09.2009, 23:14     Студенческая задачка C++ #2
думаю, что примерно так:
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
#include <iostream>
#include <conio.h>
using namespace std;
 
int number(int HUNDREDS, int TENS, int DIGITS);
 
int main() {
      
      for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
                  for (int k = 1; k < 10; k++) {
                        if ( (i^3 + j^3 + k^3) == number(i,j,k) )
                              cout << number(i,j,k) << endl;
                        //else
                        //      cout << "Fuck!\n";
                  }
            }
      }
 
      getch();
      return 0;
}
 
int number(int HUNDREDS, int TENS, int DIGITS) {
      int final = 0;
      final = HUNDREDS*100 + TENS*10 + DIGITS;
 
      return final;
}
пусть меня поправят если не так =)

Добавлено через 19 минут
для надежности в теле цикла условие можно прописать так:
C++
1
      if ( (pow(i,3) + pow(j,3) + pow(k,3)) == number(i,j,k) )
но тогда обязательно надо включить еще <math.h>
а то у меня компилятор не проглотил сперва простое возведение в степень )))
Evg
Эксперт CАвтор FAQ
17311 / 5559 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
24.09.2009, 23:41     Студенческая задачка C++ #3
> а то у меня компилятор не проглотил сперва простое возведение в степень )))

В Си "^" это не возведение в степень, а xor. А степени нет вообще. ТОгда уж проще переписать вот так: I*i*i + j*j*j + k*k*k
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
25.09.2009, 00:33     Студенческая задачка C++ #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
да и циклов как-то много
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using std::cout;
using std::endl;
 
int main(){
    int i, a, b, c;
    
    for ( i = 100; i < 1000; i++ ){
        a = i;
        b = (a % 100) / 10;
        c = a % 10;
        a /= 100;
        if ( ((a*a*a) + (b*b*b) + (c*c*c)) == i )
            cout << i << endl;
    }
    return 0;
}
Добавлено через 33 минуты
и переменных тоже много...
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using std::cout;
using std::endl;
 
int main(){
    int i;
    
    for ( i = 100; i < 1000; i++ )
        if ( ((i / 100)*(i / 100)*(i / 100) + ((i % 100) / 10)*((i % 100) / 10)*((i % 100) / 10) + (i % 10)*(i % 10)*(i % 10)) == i )
            cout << i << endl;
    return 0;
}
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.09.2009, 06:24     Студенческая задачка C++ #5
GennDALF,
В Вашем алгоритме есть еще одна существенная ошибка: У Вас выпали из проверки числа у которых есть цифры "0". Например 507 и т.п.
GennDALF
12 / 12 / 0
Регистрация: 24.09.2009
Сообщений: 61
25.09.2009, 06:33     Студенческая задачка C++ #6
блин точно! что-то я ступил.. спасибо что сказали!
l1qu1d
Сообщений: n/a
25.09.2009, 07:11     Студенческая задачка C++ #7
Большое спасибо за помощь!
Evg
Эксперт CАвтор FAQ
17311 / 5559 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
25.09.2009, 11:32     Студенческая задачка C++ #8
Цитата Сообщение от easybudda Посмотреть сообщение
да и циклов как-то много
Выбор вида программы в первую очередь должен определяться простотой её понимания, а не количеством цифр и переменных

А вариант Gendalf'а - в нём два вложенных цикла с нуля должны начинаться, а не с единицы
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
25.09.2009, 13:10     Студенческая задачка C++ #9
Цитата Сообщение от Evg Посмотреть сообщение
Выбор вида программы в первую очередь должен определяться простотой её понимания, а не количеством цифр и переменных
Хорошо, для именно этой задачи слишком много циклов и переменных. Сама по себе задача простая, как раз на три строчки. Которые, по моему скромному, не то, чтобы сложно осмыслить. Ошибаюсь?
Evg
Эксперт CАвтор FAQ
17311 / 5559 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
25.09.2009, 13:17     Студенческая задачка C++ #10
Цитата Сообщение от easybudda Посмотреть сообщение
Хорошо, для именно этой задачи слишком много циклов и переменных. Сама по себе задача простая, как раз на три строчки. Которые, по моему скромному, не то, чтобы сложно осмыслить. Ошибаюсь?
Как ты думаешь, сколько человек из 100 напишут этот фрагмент с первого раза без ошибок (не запуская при этом на исполнение). И сколько человек из 100 напишут вариант Gendalf'а без ошибок? На мой взгляд вторых будет больше

C
1
2
3
b = (a % 100) / 10;
c = a % 10;
a /= 100;
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
25.09.2009, 13:25     Студенческая задачка C++ #11
Evg, Очень спорно! Больше текста - больше ошибок. А на счёт "с первого раза" - так мы же здесь вроде как учимся... Кстати, вот в таком виде
C++
1
if ( ((i / 100)*(i / 100)*(i / 100) + ((i % 100) / 10)*((i % 100) / 10)*((i % 100) / 10) + (i % 10)*(i % 10)*(i % 10)) == i )
оно по-моему даже нагляднее. Если приглядеться повнимательнее...
Evg
Эксперт CАвтор FAQ
17311 / 5559 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
25.09.2009, 13:33     Студенческая задачка C++ #12
Цитата Сообщение от easybudda Посмотреть сообщение
Evg, Очень спорно! Больше текста - больше ошибок
Абсолютная неправда. Ошибок больше тогда, когда больше сложного текста, в который надо вдумываться. Ярким примером служит твой второй тест - лично я его даже смотреть не стал. А вот вариант gendalf'а понять с одного взгляда и без каких либо "приглядеться повнимательнее".

А вот потом такой вот "умный код" начинает плодиться и разнможаться. А при дальнейшей модификации нужно в него вникать и втыкать, что как правило заканчивается тем, что при модификации вносятся ошибки. В результате имеем то, что программы типа ИЕ только к 8-й версии за 10 лет развития начинают работать более-менее безглючно

Я не навязываю тебе твою точку зрения. Просто высказываю своё мнение, проверенное многолетним опытом
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
25.09.2009, 13:43     Студенческая задачка C++ #13
Цитата Сообщение от Evg Посмотреть сообщение
Абсолютная неправда. Ошибок больше тогда, когда больше сложного текста, в который надо вдумываться. Ярким примером служит твой второй тест - лично я его даже смотреть не стал. А вот вариант gendalf'а понять с одного взгляда и без каких либо "приглядеться повнимательнее".
Всё равно не соглашусь. Вдумываться так или иначе всё равно прийдётся. А понять одну строчку, пусть и кажущуюся на первый взгляд чем-то вроде "Здесь был Вася" на марсианском языке, по-моему всё-таки проще, чем три цикла, шесть переменных, да ещё и функцию дополнительную. По поводу ИЕ ничего не скажу. Понятия не имею, кто там что и как писал... Просто из любопытства: а Вы все эти 10 лет от него исходники где смотрели?
Evg
Эксперт CАвтор FAQ
17311 / 5559 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
25.09.2009, 14:00     Студенческая задачка C++ #14
Цитата Сообщение от easybudda Посмотреть сообщение
Всё равно не соглашусь. Вдумываться так или иначе всё равно прийдётся. А понять одну строчку, пусть и кажущуюся на первый взгляд чем-то вроде "Здесь был Вася" на марсианском языке, по-моему всё-таки проще, чем три цикла, шесть переменных, да ещё и функцию дополнительную. По поводу ИЕ ничего не скажу. Понятия не имею, кто там что и как писал... Просто из любопытства: а Вы все эти 10 лет от него исходники где смотрели?
Я его исходники не смотрел. Я написал условно. Но есть в жизни такое, что геморройно написанные программы живут недолго. А глобальный геморрой начинается вот с таких вот мелочей из разряда "сэкономить количество переменных". Убеждать тебя в чём-то нет ни времени, ни желания. Пиши так, как считаешь для себя более приемлимым. А время покажет, в чём ты был прав, а в чём ошибался

Добавлено через 11 минут
Я бы написал вот так

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int
main (void)
{
  int i, j, k, num;
 
  for (i = 1; i <= 9; i++)
    for (j = 0; j <= 9; j++)
      for (k = 0; k <= 9; k++)
        {
          num = 100*i + 10*j + k;
          if (num == (i*i*i + j*j*j + k*k*k))
            printf ("%d\n", num);
        }
 
  return 0;
}
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
25.09.2009, 14:06     Студенческая задачка C++ #15
Цитата Сообщение от Evg Посмотреть сообщение
А глобальный геморрой начинается вот с таких вот мелочей из разряда "сэкономить количество переменных".
Не, ну в крайности-то впадать не нужно. Всегда от ситуации зависит. В этом случае вполне можно и одной переменной обойтись, от которой просто по цифре отрезается. Если для ясности лучше, когда что-то в дополнительных переменных сохраняется (даже если можно было бы и "сэкономить" на них), так пусть будут переменные, да ещё и с комментариями, а то потом всё равно голову ломать прийдётся... С другой стороны, если наплодить два десятка переменных там, где и двух-то много, так запутаться ещё проще будет. Особенно если им имена давать типа a b c или вроде того... Я так считаю...
GennDALF
12 / 12 / 0
Регистрация: 24.09.2009
Сообщений: 61
25.09.2009, 18:23     Студенческая задачка C++ #16
Что касается экономии переменных и вообще того, как я написал эту задачку, то здесь причина проста: я начинал учиться программировать уже на объектно-ориентированных языках, как то VB.NET и именно С++, а не старый С. И потому мне так проще воспринимать код, когда даже расчет трехзначного числа вынесен в отдельную функцию.

Я считаю, что не спроста эволюция высокоуровневых языков стремится ввести как раз объектно-ориентированный подход, видимо в этом есть резон.
И я полностью согласен с Evg. Когда приходится часами медитировать над сложным многостраничным кодом, где каждая вторая строчка выглядит примерно как во втором варианте easybudda, то тогда начинаешь понимать, что лучше потратить 1 МБ вместо 100 кБ, и ввести 20 переменных вместо 10, но только чтобы это выглядело понятно!
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
25.09.2009, 18:41     Студенческая задачка C++ #17
Evg все правильно говорит.
А вариант easybudda можно немного исправить на более понятный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using std::cout;
using std::endl;
 
#define D0 (i%10)
#define D1 ((i%100)/10)
#define D2 (i/100)
 
int main(){
        int i;
        
        for ( i = 100; i < 1000; i++ )
        if ( D2*D2*D2+D1*D1*D1+D0*D0*D0 == i ) {
                        cout << i << endl;
        }
        return 0;
}
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
25.09.2009, 18:50     Студенческая задачка C++ #18
GennDALF, ну может быть и так... С другой стороны я вот больше в исходниках от разных никсовых програмок люблю покапаться (написанных большей частью как-раз на "старом" С)... Порой встречаются по-настоящему красивые решения, хоть на первый взгляд и абсолютно непонятные. На С++ не всегда так получилось бы, а уж про VB и речи не идёт... Опять же, если в многостраничном коде каждая вторая строчка требует того, чтоб над ней задумываться, это, видимо, тоже не спроста. И вряд ли с целью запутать тех, кто этот код потом читать будет. Мало того, обычно к сложным моментам комментарии пишут. Да и думать - не такое уж плохое занятие...
Evg
Эксперт CАвтор FAQ
17311 / 5559 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
25.09.2009, 20:30     Студенческая задачка C++ #19
Цитата Сообщение от easybudda Посмотреть сообщение
Опять же, если в многостраничном коде каждая вторая строчка требует того, чтоб над ней задумываться, это, видимо, тоже не спроста
Всё-таки надо отделять мух от котлет. Когда над каждой второй строкой надо думать из-за того, что ты попросту не знаешь внутреннее устройство программы - это одно, когда нужно думать из-за того, что кто-то решил сэкономить на переменных или на количестве строк кода - это совсем другое

Сравни два фрагмента. Пример взят из книги, чтобы не сочинять самому

C
1
child = (!LC&&!RC)?0:(!LC?RC:LC);
C
1
2
3
4
5
6
if (LC == 0 && RC == 0)
  child = 0;
else if (LC == 0)
  child = RC;
else
  child = LC;
Оба фрагмента делают одно и то же. В первом случае автор решил сэкономить количество строк. В результате получился код, в котором пока не переберёшь все комбинации, нихрена не поймёшь, хоть ты 10 строк комментария к нему напиши. Во втором случае достаточно одного взгляда, чтобы понять, что делается

Цитата Сообщение от easybudda Посмотреть сообщение
И вряд ли с целью запутать тех, кто этот код потом читать будет
А исходники разных юниксовых программ это священная корова что-ли? Их пишут такие же люди с такими же тараканами в голове. Глядя на некоторые куски кода, кроме как желания семиэтажно материться ничего не возникает. Глядя на других надо перенимать положительный опыт, и учитывать плохой. Но не наоборот

Цитата Сообщение от easybudda Посмотреть сообщение
Да и думать - не такое уж плохое занятие...
Думать полезно. Но бесполезно думать - вредно. Зачем писать код так, что над ним надо думать, когда можно написать так, что и без раздумий всё понятно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2009, 20:36     Студенческая задачка C++
Еще ссылки по теме:

задачка на с++ C++
C++ задачка
C++ задачка
Разработать класс "студенческая группа". Предусмотреть возможность работы с переменным числом студентов C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
25.09.2009, 20:36     Студенческая задачка C++ #20
C
1
2
3
4
5
6
if (LC == 0 && RC == 0)
  child = 0;
else if (LC == 0)
  child = RC;
else
  child = LC;
Я вот подумал над этим кодом и решил его можно переписать так:
C
1
child= (LC==0) ? RC : LC;
Yandex
Объявления
25.09.2009, 20:36     Студенческая задачка C++
Ответ Создать тему
Опции темы

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