Liczby nadmiarowe i deficytowe

0

Jak sprawdzić czy liczba jest nadmiarowa czy deficytowa ?

1

Chodzi o liczby doskonałe, nadmiarowe i deficytowe?
Doskonała jest wtedy gdy suma dzielników liczby jest równa tej liczbie. Np. 3 + 2 + 1 == 6
Deficytowa gdy suma dzielników jest mniejsza niż liczba. Np. 1 + 2 + 5 < 10
Nadmiarowa gdy suma dzielników jest większa niż liczba. Np. 1 + 2 + 3 + 4 + 6 + 8 + 12 > 24

Czyli znajdź dzielniki liczby. Zsumuj je. Porównaj z liczbą (do tego kroku możesz użyć algorytmu @au7h).

0
#include <iostream>
using namespace std;
int main()
{
    int wartosc, suma;
    suma = 0;
    cin >> wartosc;
    for (int i = wartosc; i > 0; i--)
    {
        if (wartosc % i == 0)
            suma += wartosc / i;
    }
    if(wartosc>suma)
        printf("Deficytowa\n");
    else if(wartosc<suma)
        printf("Nadmiarowa\n");
    else
        printf("Doskonała\n");
    return 0;
}

0

Dodaj jej dzielniki właściwe i jeśli ich suma jest mniejsza od samej liczby, liczba jest niedomiarowa (lub deficytowa), jeśli suma jest większa, liczba jest nadmiarowa. Jeśli zaś suma dzielników jest równa danej liczbie, liczba jest doskonała.
Taką definicję znalazłem w moich szpargałach i potwierdzona jest tu: https://www.britannica.com/biography/Nicomachus-of-Gerasa

Po szybkim przeszukaniu: https://pl.wikipedia.org/wiki/Liczba_deficytowa
http://mathworld.wolfram.com/DeficientNumber.html

Tak więc skłaniam się do tych ostatnich definicji.

0

Nadmiarowa:
http://mathworld.wolfram.com/AbundantNumber.html
Deficytowa:
http://mathworld.wolfram.com/DeficientNumber.html
Ze sprawdzeniem nie powinno byc problemu. No chyba zeby w gre wchodzila wydajnosc.

0
#include <iostream>
#include <bits/stdc++.h>
#include<cmath>>
using namespace std;

bool czy_doskonala(unsigned a)
{
	if(a<1)return false;//uwzgledniamy tylko liczby naturalne
	int suma=0;

	for(int i=1; i<a; i++)
		if(a%i==0)	suma+=i;//wyznaczamy dzielniki "a" i je sumujemy

	return (suma==a)?true:false;//jeśli suma dzielnikow rowna sie liczbie to funkcja zwraca prawde

}
bool czy_nadmiarowa (int n)
{
    int sum = 0;
    for (int i=1; i<=sqrt(n); i++)
    {
        if (n%i==0)
        {
            if (n/i == i)
                sum = sum + i;

            else
                sum = sum + i;
                sum = sum + (n / i);
            }
            return sum;
        }
         return (czy_nadmiarowa(n) > n);
    }




bool czy_deficytowa(int n)
{


    int sum = 0;
  for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
            if (n / i == i) {
                sum = sum + i;
            }
            else
            {
                sum = sum + i;
                sum = sum + (n / i);
            }
        }
         return sum;
    }
   return (czy_deficytowa(n) < (2 * n));
}

int main()
{



   	int x;


	cin >> x;
if(czy_doskonala(x)){
	cout <<x <<"  - doskonala"<< endl;
}	else
cout <<x <<"  -  nie doskonala"<< endl;

if(czy_nadmiarowa(x)){
	cout <<x <<"  -nadmiarowa"<< endl;
}	else
cout <<x <<"  -  nie nadmiar"<< endl;



if(czy_deficytowa(x)){
	cout <<x <<"  -deficytowa"<< endl;
}	else
cout <<x <<"  -  nie deficytowa"<< endl;




    return 0;
}

``

 jak wpiszę ciąg liczb to wyświetla pierwszą i wypisuje mi dla każdej czy deficytowa , nadmiarowa, dokonała :(
0

Po co liczysz 3 razy dzielniki? Można to zrobić raz i z funkcji zwrócić np. enuma:

enum number_type {
  ABUNDANT,
  PERFECT,
  DEFICIENT
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1