Форум программистов, компьютерный форум CyberForum.ru

Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 - C++

Восстановить пароль Регистрация
 
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
04.07.2014, 13:46     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #1
Нужно найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300
Почему-то выдает другие числа. Пожалуйста, проверьте

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <cmath>
using namespace std;
void swapRange(int &, int &);
int propDivisors(int);
int amicPairs(int, int);
int main()
{
        int rangeA;
        int rangeB;
        int numPairs;
        cout << "Input the start of the range: ";
        cin >> rangeA;
        cout << "Input the end of the range: ";
        cin >> rangeB;
        if (rangeA > 0 && rangeB > 0){
            if (rangeA > rangeB){
                cout << "End of range < start of range -- swapping values" << endl;
                swapRange(rangeA, rangeB);
            }
            numPairs = amicPairs(rangeA, rangeB);
            cout << "Range of numbers: " << rangeA << "-" << rangeB << endl;
            cout << "The number of Amicable Pairs is: " << numPairs << endl;
        }
    else{
            cout << "Unable to check non-positive values";
            cout << "Exiting" << endl;
    }
}
int propDivisors(int num){
        int sum = 0;
        int fac = 0;
    for (int k = 2; k < num; k++){
        if ((num % k) == 0){
                fac = k;
                sum += fac;
        }
    }
        return sum;
}
void swapRange(int &rangeA, int &rangeB){
        int x;
    if (rangeA > rangeB){
            x = rangeA;
            rangeA = rangeB;
            rangeB = x;
    }
        return;
}
int amicPairs(int A, int B){
        int i;
        int k;
        int counter;
    for (i = A; i < B; i++){
        for (k = B; k > A; k--){
            if (propDivisors(i) == k && i == propDivisors(k) && i != k){
                    cout << i << " and " << k << " are Amicable Numbers." << endl;
                    counter++;
            }
        }
    }
        return counter;
}
Видел еще один код, он короче, чем мой, но его я не понимаю совсем. Но он хотя бы работает. Сможете объяснить его?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
typedef unsigned long long ull_t;
 
ull_t sum_of_divs(ull_t);
bool is_friendly(ull_t, ull_t);
 
int main()
{
    const ull_t left = 1;
    const ull_t right = 10000;
 
    for (ull_t num1 = left; num1 <= right; ++num1)
        for (ull_t num2 = num1 + 1; num2 <= right; ++num2)
            if (is_friendly(num1, num2))
                std::cout << num1 << "\t" << num2 << std::endl;
 
    return 0;
}
 
ull_t sum_of_divs(ull_t number)
{
    ull_t sum = 0;
 
    for (ull_t d = 1; d < number / 2 + 1; ++d)
        if (number % d == 0)
            sum += d;
 
    return sum;
}
 
bool is_friendly(ull_t number1, ull_t number2)
{
    return sum_of_divs(number1) == number2 && sum_of_divs(number2) == number1;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2014, 13:46     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300
Посмотрите здесь:

C++ Найти все пары «дружественных чисел», которые не больше данного числа
Найти все пары дружественных чисел в диапазоне от 200 до 300 C++
Найти все пары «дружественных чисел», которые не больше данного числа/ на C++ C++
Напечатать все пары чисел-близнецов, не превышающих число 200 C++
C++ Напечатать все пары дружественных чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
04.07.2014, 14:17     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #2
Цитата Сообщение от _Лето_ Посмотреть сообщение
Нужно найти все пары дружественных чисел
Ищите. А я пойду пока узнаю что это такое.
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
04.07.2014, 14:48  [ТС]     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #3
Дру́жественные чи́сла — два различных натуральных числа, для которых сумма всех собственных делителей первого числа равна второму числу и наоборот, сумма всех собственных делителей второго числа равна первому числу. У меня мозг от этого плавится уже =___=
gru74ik
Модератор
 Аватар для gru74ik
3116 / 1342 / 167
Регистрация: 20.02.2013
Сообщений: 3,809
Записей в блоге: 17
04.07.2014, 16:31     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #4
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ищите. А я пойду пока узнаю что это такое.
угарЪ
zibertscrem
3 / 3 / 1
Регистрация: 03.07.2014
Сообщений: 19
04.07.2014, 16:46     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #5
Попробуйте вот этот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
int DivSumm(int a);//Функция находит сумму делителей числа.
bool IsFriendly(int a, int b);//Функция проверяет, являются ли числа дружественными.
int main()
{
    int RangeA,RangeB;//Пределы поиска
    printf("enter left range: ");
    scanf("%d",&RangeA);//Ввод левого предела
    printf("enter right range: ");
    scanf("%d",&RangeB);//Ввод правого предела
    //Мы проверяем числа на дружественность от левого предела к правому.
    for(int num1=RangeA; num1<=RangeB; num1++)//Просматриваем все числа из интервала
    {
        for(int num2=num1; num2<=RangeB; num2++)//Просматриваем числа, которые возможно будут дружественными с num1
        {
            if(IsFriendly(num1,num2))
            {
                printf("%d,%d\n",num1,num2);
            }
        }
    }
    return 0;
}
int DivSumm(int a)
{
    int Summ = 0;
    for(int i = 1; i<=a; i++)
    {
        Summ = (a%i)?(Summ):(Summ+i);
    }
    return Summ;
}
bool IsFriendly(int a, int b)
{
    return (DivSumm(a)==DivSumm(b));
}
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
07.07.2014, 19:27  [ТС]     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #6
zibertscrem, этот код работает не совсем правильно. Значения, которые он должен выдавать на диапазоне от 200 до 300 - это 220 и 284, а там выходят еще много других чисел, это не считая одинаковых, типа 201, 201 и тд. Если одинаковые числа я убрал, то понять почему там еще и другие числа я не могу.

Что делает эта операция?

C++
1
Summ = (a%i)?(Summ):(Summ+i);
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
07.07.2014, 19:47     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
unsigned int countDividers(unsigned int x)
{
    unsigned int result = 1;
    for(int i = 2; i * i < x; ++i)
        if(x%i == 0)
        {
            result += i;
            if(x/i != i)
                result += x/i;
        }
    return result;
}
 
int main()
{
    int l, r;
    std::cout << "Enter range: ";
    std::cin >> l >> r;
 
    for(int i=l; i<=r; ++i)
    {
        unsigned int cnt = countDividers(i);
        if (countDividers(cnt) == i && i<cnt)
            std::cout << i << ' ' << cnt << std::endl;
    }
 
    return 0;
}
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
07.07.2014, 20:00  [ТС]     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #8
Dani, спасибо, но что делает эта операция?

C++
1
2
unsigned int cnt = countDividers(i);
       if (countDividers(cnt) == i && i<cnt)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2014, 20:05     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300
Еще ссылки по теме:

C++ Найти все пары дружественных чисел, не превосходящих заданного натурального числа N
Найти все пары дружественных натуральных чисел из интервала от N 1 до N 2. C++
Из заданного интервала натуральных чисел выбрать и напечатать все пары дружественных чисел C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
07.07.2014, 20:05     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300 #9
cnt = countDividers(i) - считаем сумму делителей числа i, например, для 284 получится 220. Теперь countDividers(cnt) - считаем сумму делителей числа 220 - получится 284 - опять получилось число 284. Значит, эти 2 числа дружественные. i<cnt --- если бы этой операции не было, то выводилась бы одна пара 2 раза: 220 и 284; 284 и 220
А так, выводим пары, только где второе число больше первого
(быстрее нажать кнопку спасибо, чем писать)
Yandex
Объявления
07.07.2014, 20:05     Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300
Ответ Создать тему
Опции темы

Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru