Някой с C++ програмиране?

radi27
Мнения: 84
Регистриран: 04 сеп 2017, 20:40

Някой с C++ програмиране?

Мнение от radi27 » 17 ное 2018, 16:17

Здравейте колеги,
Имам курсова задача от университета, на която сериозно съм забил. Дисциплината се казва: Проектиране и анализ на алгоритми към Русенския университет(ако някой го е завършил).

Курсовата задача е както следва:
[i]Всички естествени числа със сума на цифрите S са подредени в растящ ред. Така например при S=3 се получава редицата 3, 12, 21, 30, 102, 111, 120, 201, 210, 300, ... . Напишете програма на C++, която по зададени S и N, намира N-тия член на тази редица.

Вход: Естествено число S(сумата) и N(номер на член от редицата).

Изход: Едно число - търсеният Nти член.

Пример:
Вход: S=3,N=5
Изход: 102[/i]

Представям си го като някаква функция, която взима сумата и създава масив с числата. После се извежда числото, записано в променлива N като брой на елемент от масива. Обаче не знам как да го напиша това.
Срока ми е до 29 ноември. Ако някой може да помогне, ще почерпя разумно. Благодаря предварително на отзовалите се.

Blue Sky
Мнения: 1864
Регистриран: 18 мар 2015, 21:47

Re: Някой с C++ програмиране?

Мнение от Blue Sky » 17 ное 2018, 16:40

[Quote]Всички естествени числа със сума на цифрите S са подредени в растящ ред. [/Quote]

Какво имаш предвид?

d0n1
Мнения: 18
Регистриран: 16 юни 2017, 02:01

Re: Някой с C++ програмиране?

Мнение от d0n1 » 17 ное 2018, 16:41

ето ти го на С, преправи си го за C++

[Quote]#include

unsigned int sum(unsigned int num) {
unsigned int r, sum = 0;

while (num > 0) {
r = num % 10;
sum = sum + r;
num /= 10;
}

return sum;
}

int find(unsigned int S, unsigned int N) {
int i = 0, cnt = 0;
while (1) {
if (sum(++i) == S) {
if (++cnt == N)
return i;
}
}
}

int main() {
printf("find: %i\n", find(3, 5));
}[/Quote]

Потребителски аватар
npet
Мнения: 1410
Регистриран: 07 фев 2014, 12:05
Контакти:

Re: Re: Някой с C++ програмиране?

Мнение от npet » 17 ное 2018, 19:42

-
Последна промяна от npet на 21 юли 2020, 10:36, променено общо 1 път.
-

radi27
Мнения: 84
Регистриран: 04 сеп 2017, 20:40

Re: Re: Някой с C++ програмиране?

Мнение от radi27 » 17 ное 2018, 20:26

За примера S=3. Първото число винаги е S. После са написани числа, чиито цифрички сумирани дават 3 и са подредени във възходящ ред.

3, 12, 21, 30, 102, 111, 120, 201, 210, 300...

3
12=1+2=3
21=2+1=3
30=3+0=3
102=1+0+2=3
111=1+1+1=3

и т.н. Мисля че ще разбереш.

d0n1
Мнения: 18
Регистриран: 16 юни 2017, 02:01

Re: Re: Re: Някой с C++ програмиране?

Мнение от d0n1 » 18 ное 2018, 12:33

Колега, загубих си 3-4 минути от живота за да ти реша задачата, няма ли поне едно мерси да кажеш? :)

radi27
Мнения: 84
Регистриран: 04 сеп 2017, 20:40

Re: Re: Re: Re: Някой с C++ програмиране?

Мнение от radi27 » 18 ное 2018, 16:51

Здравей колега,
Благодаря ти. Все още се опитвам да я разбера, но изглежда правилно.

Ако искаш дай банкова сметка на лично съобщение, за да ти пратя нещо. :)

Потребителски аватар
board
Мнения: 6803
Регистриран: 25 окт 2006, 14:01

Re: Re: Re: Re: Re: Някой с C++ програмиране?

Мнение от board » 18 ное 2018, 19:15

[Quote]Все още се опитвам да я разбера[/Quote]
Аз програмиране не съм пипал дето се вика от малък, но мисля, че разбирам как работи програмката на колегата и мога да пробвам да ти обясня.

Програмката има две функция. На едната sum() подаваш число и тя ти връща сбота на цифрите му. Другата е find(), на която подаваш каква сума от цифри да търси и кое поредно отговарящо число да ти върне.

Как работи sum()
Прави се цикъл. А num e подаденото число.
r = num % 10 - в r се запива остатъка от деленето на num на 10. Тоест маха десетиците и взима само последната цифра. Ако num е 112, r ще е равно на 2.
В променливата sum се добавя намереното r.
num/=10 дели подаденото числото на 10. С което отпада последната цифра от числото. 112 делено на 10 е 11,2 , но понеже променливата е целочислена и там закръгляването винаги е надолу, num става равно на 11 и отново се подава в началото. Въртейки цикъла се намира сбора от всички цифри.

Функцията find(), прави се цикъл, променливата i се използва за подаване на числата подред(1,2,3,4...)
if (sum(++i) == S) - тук i се вдига с единица и се подвава на функцията sum(), от където се връща сбора на цифрите и се проверява дали съвпада с търсения S. Ако съвпада,
if (++cnt == N) - брояча cnt се вдига с единица и се проверява дали това е търсеното подред съвпадение N. Ако да, се извежда търсеното число i. Ако не, цикъла се върти отново със следващото подред число. Така реално всички числа от 1 до х се подават докато не се стигне до търсеното.

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

Надявам се, че правилно разбирам кода и съм помогнал и ти да го разбереш. Ако нещо не е така, ме поправете.

tweeg
Мнения: 217
Регистриран: 09 мар 2006, 10:23

Re: Re: Някой с C++ програмиране?

Мнение от tweeg » 18 ное 2018, 19:43

Пиша това мнение с риск да прозвучи като хейт.

1. Горната програма е нагледен пример защо съвременните телефони са с 8 ядра, 8 GB RAM и пак не работят като хората, за разлика от компютри с дискета 360KB и 64KB RAM.
2. Интересно какво ще се случи с горната програма ако и се зададе да търси 20-тото число със сума от цифрите 1.

Ама така е - едно време четяхме "Искусство программирования" на Кнут на руски (просто нямаше от къде да се вземе оригинала) сега се чете "C ++ for Dummies"

d0n1
Мнения: 18
Регистриран: 16 юни 2017, 02:01

Re: Re: Re: Някой с C++ програмиране?

Мнение от d0n1 » 18 ное 2018, 21:12

1. Вярвам, че правиш разлика между CPU и RAM, защото въпросното решение може да ползва много CPU в определени случаи, но ще работи и на компютър с 64KB RAM :)

2. Приемам забележката, мога да дам и бързо рекурсивно решение, но не мисля че колегата ще го разбере на този етап, щом му е трудно да напише/разбере простото решение.

Отговори