![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
first_day |
![]() ![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Подскажите, пожалуйста, как можно найти сумму цифр числа n(сколько цифр не известно).
И, если можно, объясните как записываются циклы, как описывается строковый тип, как перевести из целочисленного в строковый и обратно. Нужно решить задачу, а я С++ только начал изучать, и вот возникла проблема... -------------------- Я бы изменил мир, да Бог не дает исходников.
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Для решения поставленной задачи нет необходимости в использовании строковых типов. Все, что тебе нужно -
...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...
|
first_day |
![]()
Сообщение
#3
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
...
int sum, X = 23453;
for(sum = 0; X; X /= 10)
sum += X % 10;
...
В С++ цикл с 0? А что означает (X/=10) и (sum+=)? А лучше объясни, пожалуйста, 2-ю и 3-ю строчки... Сообщение отредактировано: first_day - 16.11.2007 22:23 -------------------- Я бы изменил мир, да Бог не дает исходников.
|
first_day |
![]()
Сообщение
#4
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Тьфу блин, понял... только не понял зачем тут целочисленное деление?
-------------------- Я бы изменил мир, да Бог не дает исходников.
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата не понял зачем тут целочисленное деление? Затем, чтобы "отбросить" последнюю на данный момент цифру числа. Число целое, поэтому чтоб не было проблем надо делить его нацело на 10... |
first_day |
![]()
Сообщение
#6
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
А как обознаать, что цикл закончен?
просто вот здесь все выдает правильно: 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 |
![]()
Сообщение
#7
|
Гость ![]() |
Что именно тебе выдает и что ты хочешь получить? Получишь ты в sum1 сумму цифр числа, а в sum2 будет 0, потому как на момент захода во второй цикл n уже равно 0...
|
first_day |
![]()
Сообщение
#8
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Понял...
for(sum1=0; n; n/=10) Вот здесь условие окончание цикла стоит просто n, что это означает? P.S. Извиняюсь. что атк мучаю вопросами ![]() -------------------- Я бы изменил мир, да Бог не дает исходников.
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата условие окончание цикла стоит просто n, что это означает? В С/С++ цикл for продолжается до тех пор, пока условие окончания истинно. Истинно - это значит "не равно 0", потому что 0 - это false... Вот и получается, что цикл продолжается, пока n <> 0... |
first_day |
![]()
Сообщение
#10
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата Мне всегда выдает -1073741676. ![]() #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 |
![]()
Сообщение
#12
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
#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 по этим условиям... Сообщение отредактировано: first_day - 17.11.2007 14:17 -------------------- Я бы изменил мир, да Бог не дает исходников.
|
volvo |
![]()
Сообщение
#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 тоже изменялась, надо завести еще одну, временную переменную... |
first_day |
![]()
Сообщение
#14
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
#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 |
![]()
Сообщение
#15
|
Гость ![]() |
Ты задание нормально русским языком напиши... Надоело уже играть в "испорченные телефоны". Что значит, "наилучший делитель", например, чем он ЛУЧШЕ чем 2 или 12?
Сообщение отредактировано: volvo - 17.11.2007 15:12 |
first_day |
![]()
Сообщение
#16
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Извиняюсь...
Вот, смотри: Нужно найти наилучший делитель. Будем считать, что число a лучше числа b, если сумма цифр a больше суммы цифр b, а при равенстве суммы их цифр, если число a меньше числа b. А почему 9 не делитель 144? 144/9=16 ==> Делимое/делитель=частное разве не так? -------------------- Я бы изменил мир, да Бог не дает исходников.
|
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Тогда в твоем примере лучшим делителем должно быть 48: сумма цифр у него больше, чем у девятки...
|
first_day |
![]()
Сообщение
#18
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
Ну да, правильно... ошибся я.
Но беда в том, что получившаяся программа выводит только то, что вводится... -------------------- Я бы изменил мир, да Бог не дает исходников.
|
volvo |
![]()
Сообщение
#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;
}
? |
first_day |
![]()
Сообщение
#20
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 86 Пол: Мужской Реальное имя: Илья Репутация: ![]() ![]() ![]() |
volvo, спасибо тебе ОГРОМНОЕ!
Буду разбираться. Вот ты объявлял некоторые переменные в ходе работы программы... Без разницы же когда их объявлять, главное до первого использования? и вот еще такой вопрос, чтобы новую тему не создавать: Как можно вот это: for i:=length(s) downto 1 do s:=s+s[i]; записать на С++ и как в С++ переводить из вещественного в строковый и обратно? Сообщение отредактировано: first_day - 17.11.2007 20:46 -------------------- Я бы изменил мир, да Бог не дает исходников.
|
![]() ![]() |
![]() |
Текстовая версия | 24.07.2025 5:48 |