IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> C++, сумма цифр
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Подскажите, пожалуйста, как можно найти сумму цифр числа n(сколько цифр не известно).

И, если можно, объясните как записываются циклы, как описывается строковый тип, как перевести из целочисленного в строковый и обратно.

Нужно решить задачу, а я С++ только начал изучать, и вот возникла проблема...


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Для решения поставленной задачи нет необходимости в использовании строковых типов. Все, что тебе нужно -

...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Цитата(volvo @ 16.11.2007 22:11) *

...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...



В С++ цикл с 0?
А что означает (X/=10) и (sum+=)?
А лучше объясни, пожалуйста, 2-ю и 3-ю строчки...

Сообщение отредактировано: first_day -


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Тьфу блин, понял... только не понял зачем тут целочисленное деление?


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
не понял зачем тут целочисленное деление?
Затем, чтобы "отбросить" последнюю на данный момент цифру числа. Число целое, поэтому чтоб не было проблем надо делить его нацело на 10...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


А как обознаать, что цикл закончен?
просто вот здесь все выдает правильно:
sum2=0;
for(i=0; i<=n; i=i+2)
sum2=sum2+i;

А вот здесь фигню какую-то:

for(sum1=0; n; n/=10)
sum1+=n%10;
sum2=0;
for(i=0; i<=n; i=i+2)
sum2=sum2+i;


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Что именно тебе выдает и что ты хочешь получить? Получишь ты в sum1 сумму цифр числа, а в sum2 будет 0, потому как на момент захода во второй цикл n уже равно 0...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Понял...
for(sum1=0; n; n/=10)
Вот здесь условие окончание цикла стоит просто n, что это означает?
P.S. Извиняюсь. что атк мучаю вопросами smile.gif


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
условие окончание цикла стоит просто n, что это означает?
В С/С++ цикл for продолжается до тех пор, пока условие окончания истинно. Истинно - это значит "не равно 0", потому что 0 - это false... Вот и получается, что цикл продолжается, пока n <> 0...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


int sum1,sum2,n,i,vr;
cin>>n;
vr=n; //т.к. n будет превращаться в 0, сохраняю в др. переменную
sum2=0;
for(sum1=0; n; n/=10)
sum1+=n%10;
n=vr;
for(i=0;i<=n;i++)
if (n%i==0)
for(sum2=0; i!=0; i/=10)
{sum2+=i%10;
if (sum1>sum2) cout<<vr;
else if (sum1<sum2) cout<<i;
else if ((sum1==sum2) && (n<i)) cout<<vr;
else cout<<i;}

Я пытаюсь сделать вот что:
1) Нахожу сумму цифр(sum1) заданного числа(n).
2) Проверяю числа от 1 до заданного числа(i), и если встречается такое число, на которое заданное делится без остатка нахожу сумму его цифр. (sum2)
3) Сравниваю заданное число и найденное число(i) по криериям:
1. Если сумма цифр занного числа больше суммы цифр найденного, то вывожу заданное.
2. Если меньше - вывожу найденное.
3. Если суммы цифр чисел равны, а заданное меньше найденного, вывожу заданное.
4. иначе вывожу найденное.
Мне всегда выдает -1073741676.
Чего я тут намутил? smile.gif


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
Мне всегда выдает -1073741676.
blink.gif Скажи спасибо, что вообще не выбрасывает из IDE... Во-первых, ты не заканчиваешь цикл там, где надо (а для тог, чтобы это понять, надо форматировать текст как положено):

#include <iostream.h>

int main() {

int sum1,sum2,n,i,vr;
cin>>n;

vr=n;
sum2=0;
for(sum1=0; n; n/=10)
sum1+=n%10;

n=vr;
for(i=0;i<=n;i++)
if (n%i==0)
for(sum2=0; i!=0; i/=10) {
sum2+=i%10;
} // <---Эта скобка у тебя была в другом месте

if (sum1>sum2) cout<<vr;
else if (sum1<sum2) cout<<i;
else if ((sum1==sum2) && (n<i)) cout<<vr;
else cout<<i;

return 0;
}

Но это все неважно, потому что при первой же итерации второго цикла (когда i = 0) ты делаешь:

    if (n%i==0) // <--- На что делишь ???

 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


#include <iostream>
using namespace std;
int main ()
{
int sum1,sum2,n,i,vr;
cin>>n;

vr=n;
sum2=0;
for(sum1=0; n; n/=10)
sum1+=n%10;

n=vr;
for(i=1;i<=n;i++)
if (n%i==0)
for(sum2=0; i!=0; i/=10){ //не пойму, если в цикле один оператор, зачем его заключать в
sum2+=i%10;} //операторные скобки?

if (sum1>sum2) cout<<vr;
else if (sum1<sum2) cout<<i;
else if ((sum1==sum2) && (n<i)) cout<<vr;
else cout<<i;
return 0;
}

На 0 rolleyes.gif
Значит цикл нужно начинать с 1?
теперь у меня зацикливание...
+вот это сравнение мне, наверно, тоже надо делать в цикле, т.к. мне нужно выбрать число в цикле не первое, которое подойдет, а из всех от 1 до n по этим условиям...

Сообщение отредактировано: first_day -


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Тебе вот это надо, что-ли:

#include <iostream>
using namespace std;
int main ()
{
int sum1,sum2,n,i,j,vr;
cin>>n;

vr=n;
sum2=0;
for(sum1=0; n; n/=10)
sum1+=n%10;

n=vr;
for(i=1;i<=n;i++) {
if (n%i==0)
for(sum2=0, j = i; j!=0; j/=10) {
sum2+=j%10;
}

if (sum1>sum2) cout<<vr<<" ";
else if (sum1<sum2) cout<<i<<" ";
else if ((sum1==sum2) && (n<i)) cout<<vr<<" ";
else cout<<i<<" ";
}
return 0;
}

?

Проблема у тебя была в том, что во внутреннем цикле переменная i тоже изменялась, надо завести еще одну, временную переменную...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


#include <iostream>
using namespace std;
int main ()
{
int sum1,sum2,n,i,vr,j,delit;
cin>>n;
vr=n;
for(sum1=0; n; n/=10)
sum1+=n%10;

n=vr;
for (i=1;i<=n;i++) {
if (n%i==0)
for (sum2=0,j=i; j!=0; j/=10) {
sum2+=i%10;
}
if (sum1>sum2) delit=vr;
else if (sum1<sum2) delit=i;
else if ((sum1==sum2) && (n<i)) delit=vr;
else delit=i;}
cout<<delit;
return 0;
}

Я предыдущий код написалне верно... Мне нужно, чтобы оно вывело наилучший делитель числа. Т.е. если ввожу 144, то мне выводит 9.
Т.е. оно проверят все чсила от 1 до 144, находит сумму каждого числа и сравнивает ее с суммой числа 144(сумма 9), если сумма больше то сохраняет эту сумму в переменную delit и проверяет дальше, если меньше - просто проверяет дальше, если сумма равна, то сравнивает эти два числа и выбирает наименьшее, и опять же просматривает дальше, пока не просмотрит все числа.


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Ты задание нормально русским языком напиши... Надоело уже играть в "испорченные телефоны". Что значит, "наилучший делитель", например, чем он ЛУЧШЕ чем 2 или 12?

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Извиняюсь...
Вот, смотри:
Нужно найти наилучший делитель. Будем считать, что число a лучше числа b, если сумма цифр a больше суммы цифр b, а при равенстве суммы их цифр, если число a меньше числа b.

А почему 9 не делитель 144?
144/9=16 ==> Делимое/делитель=частное
разве не так?


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Тогда в твоем примере лучшим делителем должно быть 48: сумма цифр у него больше, чем у девятки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


Ну да, правильно... ошибся я.
Но беда в том, что получившаяся программа выводит только то, что вводится...


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






А вот эта:

#include <iostream>
using namespace std;
int main ()
{
int n, best_div, best_sum = 0;
cin >> n;

for(int i = 1; i <= n; i++) {
int s = 0;
if(n % i == 0) {
for(int j = i; j; j /= 10) s += j%10;

if(s > best_sum) {
best_sum = s;
best_div = i;
}
else
if(s == best_sum) {
if(best_div > i) best_div = i;
}
}
}
cout << best_div << endl;
return 0;
}


?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


volvo, спасибо тебе ОГРОМНОЕ!
Буду разбираться.

Вот ты объявлял некоторые переменные в ходе работы программы... Без разницы же когда их объявлять, главное до первого использования?

и вот еще такой вопрос, чтобы новую тему не создавать:
Как можно вот это:
for i:=length(s) downto 1 do
s:=s+s[i];
записать на С++

и как в С++ переводить из вещественного в строковый и обратно?

Сообщение отредактировано: first_day -


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.09.2020 20:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name