Loading...
KristiqnKonov avatar KristiqnKonov 1 Точки

C++ помощ

Здравейте, имам задача да напиша програма на С++ със следното условие: Напишете програма за получаване на всички естествени числа непревишаващи n, за които са равни на сумата от кубовете на своите цифри. Ще се радвам за малко помощ защото нито се сещам за такова число, а и влизам в безкраен цикъл.

Тагове:
0
C++ Programming
niagara avatar niagara 22 Точки

Въртиш фор цикъл докато i <=n. Във тялото му изчисляваш сумата и с един if проверяваш дали sum==i. Ако е вярно извеждаш i. За сбора отделяш последната цифра и я добавяш на трета степен към сбора.

Примери за такива числа са 0;1.

0
03/11/2018 14:33:12
KristiqnKonov avatar KristiqnKonov 1 Точки

Така го мислих и аз до сега, пробвах и с do..while но влизам в безкраен цикъл и в конзолата излизат само 0. 

for (int i = 0; i <= n; i++)
    {
        k = i % 10;
        i = i / 10;
        Sum = Sum + k * k*k;
        if (Sum==i)
        {
            cout << i;
        }

ето това е но не мога да си видя грешката къде е :\

 

0
niagara avatar niagara 22 Точки

Не бива да редактгираш i защото него проверява for-a. За отделянето на цифрите използвай друга променлива със същата стойност. Трябва ти и още 1 цикъл за пресмятане на сбора, защото така взимаш само последната цифра.

0
MartinBG avatar MartinBG 4803 Точки

i = i / 10; 

Това как ще се отрази на цикъла, който въртиш? ;)

0
MartinBG avatar MartinBG 4803 Точки

Това ли е цялото условие?

Какво си написал до момента?

Задачата е инересна - има наивно решение, както и възможности за оптимизации, ако са необходими.

Иначе, ето едно такова число :)

1 = 1 * 1 * 1

 

0
03/11/2018 14:29:05
KristiqnKonov avatar KristiqnKonov 1 Точки

Да това е цялото условие.

Пробвах първо с for, но явно допускам някъде грешка, след това пробвах и do..while , но някъде пак греша 

0
MartinBG avatar MartinBG 4803 Точки

Нещо ме съмнява това да е цялото условие, защото с изключение на 0 и 1 не изглежда да има съвпадения за числа до 100 милиона включително. 

0
KristiqnKonov avatar KristiqnKonov 1 Точки

for (int i = 0; i <= n; i++)
    {
        d = i;
        do
        {
            k = d % 10;
            d = d / 10;
            Sum = Sum + k * k*k;
        } while (d!=0);
        
            
            if (Sum == i)
            {
                cout << Sum;
            }

0
kolioi avatar kolioi 641 Точки

Почти си я направил. Само трябва да декларираш някъде променливите k, d и Sum

Ето ти едно примерно решение, цяла работеща програмка. Една забележка само: 0 (нула) НЕ е естествено число. Цяло число е, но не влиза в множеството на естествените числа.

#include <iostream>
int main()
{
	using namespace std;

	int n;
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		int sum = 0;
		for (int number = i; number; number /= 10)
		{
			int last_digit = number % 10;
			sum += last_digit * last_digit * last_digit;
		}
		if (sum == i)
			cout << i << endl;
	}

	return 0;
}



В интервала от 1 до INT_MAX [1,2147483647] има само 5 естествени числа с това свойство и те са 1, 153, 370, 371 и 407.

0
kolioi avatar kolioi 641 Точки

Всъщност, не е необходимо на всяка итерация във вътрешния цикъл да изчисляваме куба на всяка цифра. Цифрите са краен брой и може предварително да изчислим техните кубове.

int cubes[] = { 0, 1, 8, 27, 64, 125, 216, 343, 512, 729 };

и после във вътрешния цикъл правим само

sum += cubes[last_digit];

От тук не е трудно да се досетим, че задачата няма решение за n > 10,000 (Защо?).

(Колко по-лесно се мисли на трезва глава! laugh)

0
KristiqnKonov avatar KristiqnKonov 1 Точки

Благодаря много!!! Може ли само да ми обясниш защо ако декларирам Sum извън цикъла програмката не работи? :\

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.