#include<iostream>
using namespace std;
int search_sum(unsigned int num)
{
unsigned int bound = num/2, sum = 0;
for(int i = 1; i <= bound; i++)
if(num % i == 0)
sum += i;
return sum;
}
int main()
{
unsigned int n, a, b;
cout << "Eter a positive number:" << endl;
cin >> n;
for( a = 1; a <= n; a++)
{
b = search_sum(a);
if( a == search_sum(b) )
cout<<"\ta = "<<a<<"\tb = "<<b<<endl;
}
return 0;
}
С++ срочно нужен хелп
Текст задания: написать програму для решения следующей задачи, вводиться натуральное положительное число Н, найти все такие пары чисел а и б, при условии что а = сумма делителей б(кроме самого б), и б = сумма делителей а(кроме самого а).. А и Б не привышают Н...
вот что пока у меня есть:
#include<iostream>
using namespace std;
int main()
{
int x, dal, n, i=0;
int a[n][4];
cout << "ENTER N" << endl;
cin >> n;
// zzapolnenie + summa delitelej
do{
a[0] = i + 1;
dal = 1;
do {
x = a[1] % dal;
if (x==0) a[1]=a[1] + dal;
dal++;
}while(a[0]>=dal);
cout << a[0] << " " << a[1] << endl;
i++;
}while(i<=n);
system("pause");
return 0;
}
по идеи это должно ввыводить по порядку цифры от 1 до Н, и находить сумму делителей...
Хелп плиз.....
кто-нибудь подкинет идею???
правила форума.
за оптималность нe ручаюсь, но вроде работает.
не надо удивляться когда результат типа: а == 6, b == 6.
сумма делителей числа 6: 1+2+3 == 6 => b = 6 => а == b == 6.
если надо избежать таких а и б, тогда надо изменить иф:
вместо:
написать:
[COLOR=red]темы называй нормально, плиз. читаем[/COLOR]
за оптималность нe ручаюсь, но вроде работает.
Код:
не надо удивляться когда результат типа: а == 6, b == 6.
сумма делителей числа 6: 1+2+3 == 6 => b = 6 => а == b == 6.
если надо избежать таких а и б, тогда надо изменить иф:
вместо:
Код:
if( a == search_sum(b) )
написать:
Код:
if( a != b && a == search_sum(b) )
Код:
#include<iostream>
using namespace std;
int main()
{
int x, dal, n, i=0;
[COLOR=darkgreen]/* нельзя объявлять массив статического размера при помощи переменной(а если бы шла речь о динaмическом массиве, тогда прежде переменной n надо задать какое то значение). */[/COLOR]
int a[[COLOR=red]n[/COLOR]][4];
cout << "ENTER N" << endl;
cin >> n;
using namespace std;
int main()
{
int x, dal, n, i=0;
[COLOR=darkgreen]/* нельзя объявлять массив статического размера при помощи переменной(а если бы шла речь о динaмическом массиве, тогда прежде переменной n надо задать какое то значение). */[/COLOR]
int a[[COLOR=red]n[/COLOR]][4];
cout << "ENTER N" << endl;
cin >> n;
Большое спасибо!!!!!!!!
С меня цветы и шампанское:) :) :)
и также не понял откуда num, это счётчик???
насчет bound все просто. делители числа Х находятся между значениями 1 ... Х/2+1. тут я схолтурила :), из-за того что я начала for(в main) с 1-цы, я написала что bound = Х/2 (num/2). в принцепе оставила мелочи тебе на дороботку.
Цитата:
и также не понял откуда num, это счётчик???
Цитата:
. [COLOR=red]А и Б не привышают Н.[/COLOR]..
из этой фразы я сделала вывод что значения а и б находятся между 1 и Н (1 ... Н).
у нас есть число Н введенное пользователем. я сделала фор в main значение которого начинается с 1(удобней былобы хотя бы с 3, имхо. 1 и 2 всеравно не отвечают условию задачи) и заканчивается Н( А и Б не привышают Н). я беру каждое значение от 1 до Н(а == num) и нахожу для них сумму делителей(кроме самого а) и присваевую значение полученной суммы переменной б(по условию сумма делителей а должна равняться б и наоборот). затем делаем 2-ую проверку: находим сумму делителей б и проверяем равна ли она а. данное решение оснавона на моей логике, и нет гарантии что я не ошиблась.
а в общем мое решение основано на обыкновенном переборе.
Ещё раз БОЛЬШОЕ спасибо!!!!!:)
тут я одну проверку упустила! надо добавить иф:
Код:
for( a = 1; a <= n; a++)
{
b = search_sum(a);
[COLOR=red] if(b > n) continue;[/COLOR]
if( a == search_sum(b) )
cout<<"\ta = "<<a<<"\tb = "<<b<<endl;
}
{
b = search_sum(a);
[COLOR=red] if(b > n) continue;[/COLOR]
if( a == search_sum(b) )
cout<<"\ta = "<<a<<"\tb = "<<b<<endl;
}