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

C++ помощ

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

Тагове:
0
C++ Programming
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
kolioi avatar kolioi 641 Точки

Значи Sum може да се декларира извън външния цикъл, обаче задължително трябва да се нулира преди началото на вътрешния цикъл, иначе ще се натрупат сумите за всички числа от 1 до n, а ние искаме да изчислим сумата за всяко число по отделно. По принцип една променлива се декларира точно преди да се използва, с други думи, там където ти трябва, а не предварително. Но този код също ще работи

int sum;
for (int i = 1; i <= n; i++)
{
	sum = 0;
	for (int number = i; number; number /= 10)
	{
		......
	}
	......
}

Но най-важно е да разбереш, че не трябва да се променя индекса i вътре в цикъла, защото това може да доведе до безкраен цикъл. Просто си въвеждаш нова променлива и работиш с нея, но не променяш стойността на i.

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