// starting, end, number, sum of the divisor, delimiter
int pocetok, kraj, broj, zbir_na_deliteli=0, delitel=1;
printf("Vnesi go intervalot: "); // Enter the interval
scanf("%d%d", &pocetok, &kraj);
for(broj=pocetok;broj<=kraj;broj++)
for(;delitel<broj;delitel++){
if (broj%delitel==0)
zbir_na_deliteli+=delitel;
}
if (zbir_na_deliteli==broj)
// The number %d is a perfect number
printf("Brojot %d e sovrshen broj\n", broj);
}
Это программа, которую я написал. Я буквально сравниваю это построчно с решенной программой, которая делает то же самое, за исключением того, что одна работает, а эта - нет.
Может кто-нибудь объяснить мне, что я делаю не так?
Попробуйте for(;delitel<broj;delitel++){
-> for(int delitel = 1;delitel<broj;delitel++){
Нет, инициализируется в первой строке. Необязательно быть там, где должно быть начальное значение в цикле for. Я не получаю сообщение об ошибке ether. @pmg
Да, это необходимо, потому что вы делаете zbir_na_deliteli+=delitel
. Почему не только zbir_na_deliteli++
?? Возможно, я неправильно понимаю, что вы пытаетесь вычислить, поскольку я не знаю, что означают ваши имена переменных. Похоже, вы просто пытаетесь их сосчитать. Но в вашем вопросе написано «распечатайте числа». Вы печатаете что-то только один раз, после всех циклов. Возможно вам не хватает {
}
zbir_na_deliteli + = delitel - суммирование знаменателей числа. Я не могу их суммировать, если увеличиваю их на 1 @paddy
Так, тогда не следует ли каждый раз устанавливать значение 1 перед внутренним циклом?
Шпионское ПО, Отсутствует делитель = 1; внутри петли относится к delitel = 1;
внутри for(broj=pocetok....
, а не к for(;delitel<broj...
.
@chux я думал, что вы не можете объявлять переменные внутри цикла for в c. По крайней мере, так сказал мой профессор колледжа.
Вам не нужно объявлять это там. Вам просто нужно установить значение. for(delitel=1;delitel<broj;delitel++)
Шпионское ПО, какую ошибку компилятора или результат выполнения вы получили с for(int delitel = 1;delitel<broj;delitel++){
?
Шпионское ПО: «вы не можете объявлять переменные внутри цикла for в c.» Не подходит для кода до C99. Хорошо, чтобы делать это последние 19 лет.
@chux, я не получаю сообщения об ошибке. Программа выполняется, но после того, как я ввожу начальное и конечное значение, она ничего не распечатывает. Я поместил свой delitel = 1 в цикл for, как вы сказали.
"но после того, как я ввожу начальное и конечное значение" -> почему секретность? Какие входные значения, какой выход ожидался?
Can someone explain to me what am I doing wrong?
Счетчик delitel
необходимо перезапускать по 1 в каждом цикле.
// for(;delitel<broj;delitel++){
for (int delitel = 1; delitel < broj; delitel++) {
Сумма zbir_na_deliteli
должна быть сброшена на 0 в каждом цикле.
for (int broj = pocetok; broj <= kraj; broj++) {
int zbir_na_deliteli = 0;
Образец кода:
void Printing_out_the_perfect_numbers(int pocetok, int kraj) {
for (int broj = pocetok; broj <= kraj; broj++) {
int zbir_na_deliteli = 0;
for (int delitel = 1; delitel < broj; delitel++) {
if (broj % delitel == 0) {
zbir_na_deliteli += delitel;
}
}
if (zbir_na_deliteli == broj) {
printf("Brojot %d e sovrshen broj\n", broj);
}
}
}
int main() {
Printing_out_the_perfect_numbers(1, 10000);
}
Выход
Brojot 6 e sovrshen broj
Brojot 28 e sovrshen broj
Brojot 496 e sovrshen broj
Brojot 8128 e sovrshen broj
Более быстрый подход будет проверять не деление до broj
, а квадратный корень из broj
. Вместо того, чтобы вычислять квадратный корень напрямую, отслеживайте частное, а также остаток. Многие компиляторы предоставляют частное и остаток (%
и /
) с помощью одного вычисления, чтобы не подвергаться дополнительному дорогостоящему делению.
void Printing_out_the_perfect_numbers(int pocetok, int kraj) {
for (int broj = pocetok; broj <= kraj; broj++) {
int zbir_na_deliteli = 0;
int kvocient = broj;
for (int delitel = 1; delitel < kvocient; delitel++) {
if (broj % delitel == 0) {
kvocient = broj / delitel;
zbir_na_deliteli += delitel;
if (kvocient > delitel) {
if (delitel != 1) zbir_na_deliteli += kvocient;
} else {
break;
}
}
}
if (zbir_na_deliteli == broj) {
printf("Brojot %d e sovrshen broj\n", broj);
}
}
}
См. Идеальное число и Пагубное число
второй ответ быстрее с точки зрения времени выполнения?
@Spyware Да, быстрее. По мере увеличения n
он намного быстрее. Но существуют даже более быстрые методы.
Возможно, отсутствует
delitel = 1;
внутри цикла?