Что именно тебе выдает и что ты хочешь получить? Получишь ты в sum1 сумму цифр числа, а в sum2 будет 0, потому как на момент захода во второй цикл n уже равно 0...
first_day
17.11.2007 14:40
Понял... for(sum1=0; n; n/=10) Вот здесь условие окончание цикла стоит просто n, что это означает? P.S. Извиняюсь. что атк мучаю вопросами
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. Чего я тут намутил?
volvo
17.11.2007 17:49
Цитата
Мне всегда выдает -1073741676.
Скажи спасибо, что вообще не выбрасывает из 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 Значит цикл нужно начинать с 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;
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;
Вот ты объявлял некоторые переменные в ходе работы программы... Без разницы же когда их объявлять, главное до первого использования?
и вот еще такой вопрос, чтобы новую тему не создавать: Как можно вот это: 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);
А как в С++ вообще строковый тип обозначается?
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;
Куда уж первостепеннее. На этом все завязано...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.