Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
1

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

04.07.2014, 13:46. Показов 2062. Ответов 8
Метки нет (Все метки)

Нужно найти все пары дружественных чисел, лежащих в диапазоне от 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;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2014, 13:46
Ответы с готовыми решениями:

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

Найти все пары дружественных числе, лежащих в диапазоне от 200 до 300
Найти все пары дружественных числе, лежащих в диапазоне от 200 до 300. Можно полностью готовую...

Найти все пары дружественных чисел в диапазоне от 200 до 300
Помогите пожалуйста с решением задачи в С++. Вот условие: используя оператор цикла for, решить...

Найти пары дружественных чисел в диапазоне от 200 до 300
Два натуральных числа называется дружественными, если каждое из них равно сумме всех делителей...

8
Почетный модератор
Эксперт С++
5843 / 2852 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
04.07.2014, 14:17 2
Цитата Сообщение от _Лето_ Посмотреть сообщение
Нужно найти все пары дружественных чисел
Ищите. А я пойду пока узнаю что это такое.
1
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
04.07.2014, 14:48  [ТС] 3
Дру́жественные чи́сла — два различных натуральных числа, для которых сумма всех собственных делителей первого числа равна второму числу и наоборот, сумма всех собственных делителей второго числа равна первому числу. У меня мозг от этого плавится уже =___=
0
Эксперт CЭксперт С++
5064 / 2251 / 331
Регистрация: 20.02.2013
Сообщений: 5,602
Записей в блоге: 19
04.07.2014, 16:31 4
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ищите. А я пойду пока узнаю что это такое.
угарЪ
0
3 / 3 / 4
Регистрация: 03.07.2014
Сообщений: 19
04.07.2014, 16:46 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));
}
0
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
07.07.2014, 19:27  [ТС] 6
zibertscrem, этот код работает не совсем правильно. Значения, которые он должен выдавать на диапазоне от 200 до 300 - это 220 и 284, а там выходят еще много других чисел, это не считая одинаковых, типа 201, 201 и тд. Если одинаковые числа я убрал, то понять почему там еще и другие числа я не могу.

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

C++
1
Summ = (a%i)?(Summ):(Summ+i);
0
1402 / 644 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
07.07.2014, 19:47 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;
}
0
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
07.07.2014, 20:00  [ТС] 8
Dani, спасибо, но что делает эта операция?

C++
1
2
unsigned int cnt = countDividers(i);
       if (countDividers(cnt) == i && i<cnt)
0
1402 / 644 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
07.07.2014, 20:05 9
cnt = countDividers(i) - считаем сумму делителей числа i, например, для 284 получится 220. Теперь countDividers(cnt) - считаем сумму делителей числа 220 - получится 284 - опять получилось число 284. Значит, эти 2 числа дружественные. i<cnt --- если бы этой операции не было, то выводилась бы одна пара 2 раза: 220 и 284; 284 и 220
А так, выводим пары, только где второе число больше первого
(быстрее нажать кнопку спасибо, чем писать)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2014, 20:05

Функция находящая все пары дружественных чисел, лежащих в диапазоне от n до m
Даны натуральные числа n и m. Найти все пары дружественных чисел, лежащих в диапазоне от n до m....

Найти все пары дружественных чисел в диапазоне [n1, n2]
Два натуральных числа называются дружественными, если каждое из них равно сумме простых делителей...

В заданном диапазоне найти все пары натуральных дружественных чисел, удовлетворяющих условию
Два натуральных числа называются дружественными, если каждое из них равно сумме всех натуральных...

Найти все пары дружественных натуральных чисел из интервала от N 1 до N 2.
Очень нужна помощь!) Помогите пожалуйста) в С++, visual studio учусь на первом курсе мех-мата: ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.