Помощь - Поиск - Пользователи - Календарь
Полная версия: C++, сумма цифр
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
first_day
Подскажите, пожалуйста, как можно найти сумму цифр числа n(сколько цифр не известно).

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

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

...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...
first_day
Цитата(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
Тьфу блин, понял... только не понял зачем тут целочисленное деление?
volvo
Цитата
не понял зачем тут целочисленное деление?
Затем, чтобы "отбросить" последнюю на данный момент цифру числа. Число целое, поэтому чтоб не было проблем надо делить его нацело на 10...
first_day
А как обознаать, что цикл закончен?
просто вот здесь все выдает правильно:
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
Что именно тебе выдает и что ты хочешь получить? Получишь ты в sum1 сумму цифр числа, а в sum2 будет 0, потому как на момент захода во второй цикл n уже равно 0...
first_day
Понял...
for(sum1=0; n; n/=10)
Вот здесь условие окончание цикла стоит просто n, что это означает?
P.S. Извиняюсь. что атк мучаю вопросами smile.gif
volvo
Цитата
условие окончание цикла стоит просто n, что это означает?
В С/С++ цикл for продолжается до тех пор, пока условие окончания истинно. Истинно - это значит "не равно 0", потому что 0 - это false... Вот и получается, что цикл продолжается, пока n <> 0...
first_day
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
Цитата
Мне всегда выдает -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
#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
Тебе вот это надо, что-ли:

#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
#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
Ты задание нормально русским языком напиши... Надоело уже играть в "испорченные телефоны". Что значит, "наилучший делитель", например, чем он ЛУЧШЕ чем 2 или 12?
first_day
Извиняюсь...
Вот, смотри:
Нужно найти наилучший делитель. Будем считать, что число a лучше числа b, если сумма цифр a больше суммы цифр b, а при равенстве суммы их цифр, если число a меньше числа b.

А почему 9 не делитель 144?
144/9=16 ==> Делимое/делитель=частное
разве не так?
volvo
Тогда в твоем примере лучшим делителем должно быть 48: сумма цифр у него больше, чем у девятки...
first_day
Ну да, правильно... ошибся я.
Но беда в том, что получившаяся программа выводит только то, что вводится...
volvo
А вот эта:

#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
volvo, спасибо тебе ОГРОМНОЕ!
Буду разбираться.

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

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

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

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

    // 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
Ну можно же как-то слово перевернуть?

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

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

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

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

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


Т.е. std это переменная? И описывать нужно через 2 двоеточия?
volvo
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
Цитата
std - это область видимости. Есть в С++ (ты же сказал, что пользуешься С++, а не чистым С) такой namespace (ты кстати должен о нем знать: в твоей программе - пост №12 - присутствует строка "using namespace std;").


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

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

А что, std - это нечто первостепенное, то, с чего нужно начинать изучать язык?
volvo
В С++ даже вывод на экран - это
std::cout << "Hello world!" << std::endl;
Куда уж первостепеннее. На этом все завязано...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.