Подскажите, пожалуйста, как можно найти сумму цифр числа n(сколько цифр не известно).
И, если можно, объясните как записываются циклы, как описывается строковый тип, как перевести из целочисленного в строковый и обратно.
Нужно решить задачу, а я С++ только начал изучать, и вот возникла проблема...
Для решения поставленной задачи нет необходимости в использовании строковых типов. Все, что тебе нужно -
...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...
...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...
Тьфу блин, понял... только не понял зачем тут целочисленное деление?
А как обознаать, что цикл закончен?
просто вот здесь все выдает правильно:
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;
Что именно тебе выдает и что ты хочешь получить? Получишь ты в sum1 сумму цифр числа, а в sum2 будет 0, потому как на момент захода во второй цикл n уже равно 0...
Понял...
for(sum1=0; n; n/=10)
Вот здесь условие окончание цикла стоит просто n, что это означает?
P.S. Извиняюсь. что атк мучаю вопросами
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;}
#include <iostream.h>Но это все неважно, потому что при первой же итерации второго цикла (когда i = 0) ты делаешь:
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;
}
if (n%i==0) // <--- На что делишь ???
#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;
}
Тебе вот это надо, что-ли:
#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;
}
#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;
}
Ты задание нормально русским языком напиши... Надоело уже играть в "испорченные телефоны". Что значит, "наилучший делитель", например, чем он ЛУЧШЕ чем 2 или 12?
Извиняюсь...
Вот, смотри:
Нужно найти наилучший делитель. Будем считать, что число a лучше числа b, если сумма цифр a больше суммы цифр b, а при равенстве суммы их цифр, если число a меньше числа b.
А почему 9 не делитель 144?
144/9=16 ==> Делимое/делитель=частное
разве не так?
Тогда в твоем примере лучшим делителем должно быть 48: сумма цифр у него больше, чем у девятки...
Ну да, правильно... ошибся я.
Но беда в том, что получившаяся программа выводит только то, что вводится...
А вот эта:
#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;
}
volvo, спасибо тебе ОГРОМНОЕ!
Буду разбираться.
Вот ты объявлял некоторые переменные в ходе работы программы... Без разницы же когда их объявлять, главное до первого использования?
и вот еще такой вопрос, чтобы новую тему не создавать:
Как можно вот это:
for i:=length(s) downto 1 do
s:=s+s[i];
записать на С++
и как в С++ переводить из вещественного в строковый и обратно?
В С++ вообще работа со строками по другому реализована, так что простое копирование кода тут не поможет.
А насчет второй части вопроса -
// int -> float
int a = 10;
float f = static_cast<float>(a);
// float -> int
f = 12.7;
a = static_cast<int>(f);
Ну можно же как-то слово перевернуть?
Т.е.
s="Слово";
int n=ito(s);
А как в С++ вообще строковый тип обозначается?
Ну т.е. например вместо "слово", получить "оволс". А если быть точнее мне нужно число развернуть. (Вместо 1234 поучить 4321).
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;
}
Значит, ты учишь не С++... Учить С++ и не знать, что такое std - это просто нереально.
В С++ даже вывод на экран - это
std::cout << "Hello world!" << std::endl;Куда уж первостепеннее. На этом все завязано...