Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ C++, сумма цифр

Автор: first_day 17.11.2007 1:54

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

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

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

Автор: volvo 17.11.2007 2:11

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

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

Автор: first_day 17.11.2007 2:21

Цитата(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 17.11.2007 2:43

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

Автор: volvo 17.11.2007 3:06

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

Автор: first_day 17.11.2007 5:11

А как обознаать, что цикл закончен?
просто вот здесь все выдает правильно:
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;

Автор: volvo 17.11.2007 5:54

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

Автор: first_day 17.11.2007 14:40

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

Автор: volvo 17.11.2007 15:22

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

Автор: first_day 17.11.2007 17:15

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

Автор: volvo 17.11.2007 17:49

Цитата
Мне всегда выдает -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) // <--- На что делишь ???


Автор: first_day 17.11.2007 18:11

#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 по этим условиям...

Автор: volvo 17.11.2007 18:25

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

#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 тоже изменялась, надо завести еще одну, временную переменную...

Автор: first_day 17.11.2007 19:06

#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 и проверяет дальше, если меньше - просто проверяет дальше, если сумма равна, то сравнивает эти два числа и выбирает наименьшее, и опять же просматривает дальше, пока не просмотрит все числа.

Автор: volvo 17.11.2007 19:11

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

Автор: first_day 17.11.2007 19:18

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

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

Автор: volvo 17.11.2007 19:29

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

Автор: first_day 17.11.2007 19:32

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

Автор: volvo 17.11.2007 20:00

А вот эта:

#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;
}


?

Автор: first_day 17.11.2007 20:16

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

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

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

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

Автор: volvo 17.11.2007 20:23

В С++ вообще работа со строками по другому реализована, так что простое копирование кода тут не поможет.

А насчет второй части вопроса -

    // int -> float
int a = 10;
float f = static_cast<float>(a);

// float -> int
f = 12.7;
a = static_cast<int>(f);



А, ты про строковый... Мне показалось про целочисленный...

В строковый - это atoi/itoa

Автор: first_day 17.11.2007 20:29

Ну можно же как-то слово перевернуть?

Т.е.
s="Слово";
int n=ito(s);

А как в С++ вообще строковый тип обозначается? smile.gif

Автор: volvo 17.11.2007 20:52

Цитата
Вот ты объявлял некоторые переменные в ходе работы программы... Без разницы же когда их объявлять, главное до первого использования?
Вообще-то переменная должна существовать только в блоке, в котором она используется. Если у меня цикл, то переменную цикла лучше объявлять именно для этого цикла, а не где-то в другом месте, правда? Меньше вероятности ошибиться.

Цитата
А как в С++ вообще строковый тип обозначается?
Или массив char-ов, или std::string. В зависимости от задачи...

Цитата
Ну можно же как-то слово перевернуть?
Что значит "перевернуть"?

Автор: first_day 18.11.2007 0:29

Ну т.е. например вместо "слово", получить "оволс". А если быть точнее мне нужно число развернуть. (Вместо 1234 поучить 4321).

Цитата
<...>или std::string. В зависимости от задачи...


Т.е. std это переменная? И описывать нужно через 2 двоеточия?

Автор: volvo 18.11.2007 0:44

std - это область видимости. Есть в С++ (ты же сказал, что пользуешься С++, а не чистым С) такой namespace (ты кстати должен о нем знать: в твоей программе - пост №12 - присутствует строка "using namespace std;").

А чтобы развернуть строку, достаточно:


#include <string>
#include <iostream>

using namespace std;

int main() {
string s = "start";
reverse(s.begin(), s.end());
cout << s << endl;
return 0;
}


Автор: first_day 18.11.2007 1:07

Цитата
std - это область видимости. Есть в С++ (ты же сказал, что пользуешься С++, а не чистым С) такой namespace (ты кстати должен о нем знать: в твоей программе - пост №12 - присутствует строка "using namespace std;").


Да, изучаю я С++. Но когда нам препод рассказывал структуру программы, про строку "using namespace std;" он сказал так: пока не забивайте голову, это будет позже.

Автор: volvo 18.11.2007 1:42

Значит, ты учишь не С++... Учить С++ и не знать, что такое std - это просто нереально.

Автор: first_day 18.11.2007 1:47

Цитата
Значит, ты учишь не С++... Учить С++ и не знать, что такое std - это просто нереально.

В 5-7 классах дети учат физику и не знаю ничего о векторах... им же не говорят, что нереально учить физику и не знать вектора?

А что, std - это нечто первостепенное, то, с чего нужно начинать изучать язык?

Автор: volvo 18.11.2007 1:55

В С++ даже вывод на экран - это

std::cout << "Hello world!" << std::endl;
Куда уж первостепеннее. На этом все завязано...