• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Największa liczba dzielników

Object Storage Arubacloud
0 głosów
788 wizyt
pytanie zadane 1 października 2016 w C i C++ przez Blue Obywatel (1,180 p.)

Mam zadanie, gdzie należy posortować liczby całkowite od 1 do n według liczby dzielników. Napisałem kod, który u mnie działa tylko dla bardzo małych n (nie wiem, dlaczego). Proszę o pomoc. 

#include<iostream>
#include<algorithm>

using namespace std;

bool division (int a, int b) {
	
	int d_a=0; //liczba dodatnich dzielnikow liczby a
	int d_b=0; //liczba oddatnich dzielnikow liczby b
	
	for (int i=1; i<=a; i++) {
		
		if (a%i==0) d_a++;
		
	}
	
	for (int i=1; i<=b; i++) {
		
		if (b%i==0) d_b++;
		
	}
	
	if (d_a>d_b) return a>b;
	if (d_a<d_b) return a<b;
	if (d_a==d_b) return a<b;
	
}

int main () {
	
	int n;
	
	cin>>n;
	
	int numbers[n];
	
	for (int i=0; i<n; i++) {
		
		numbers[i]=i+1;
		
	}
	
	sort(numbers, numbers+n, division);
	
	for (int i=0; i<n; i++) {
		
		cout<<numbers[i]<<endl;
		
	}
	
	return 0;
	
}

 

1 odpowiedź

–1 głos
odpowiedź 1 października 2016 przez Michał Muzyka Pasjonat (24,080 p.)
    cin>>n;
     
    int numbers[n];

nie wolno robić czegoś takiego, spróbuj tak:
 

int n;
cin>>n;

int* numbers = new int [n];


//reszta zadania




delete [] numbers;

 

komentarz 1 października 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)

Pokaż mi gdzie ja napisałem, że to jest dobry sposób? Napisałem jedynie, że tak można zrobić.

no właśnie, jeśli podasz przed kompilacją w stdin wartość,

Nie to nie jest podana wartość przed kompilacją on to po prostu podaje podczas działania programu  

komentarz 2 października 2016 przez Michał Muzyka Pasjonat (24,080 p.)
dobre w sensie poprawne

to właśnie nie wiem gdzie tak można zrobić
w kompilatorze visual studio 2015 nie możesz zrobić takiej rzeczy co według mnie dyskwalifikuje ten pomysł już na starcie, oraz jak napisał sam twórca c++ nie jest to rozwiązanie poprawne
komentarz 2 października 2016 przez Blue Obywatel (1,180 p.)
Ten wątek został już chyba wyczerpany, więc czy mógłby ktoś przeanalizować mój kod pod kątem funkcji sortującej i funkcji wyznaczającej liczbę dzielników? Interesuje mnie szczególnie, czy są poprawnie połączone.
komentarz 2 października 2016 przez Michał Muzyka Pasjonat (24,080 p.)

raczej są poprawnie połączone lecz ja bym użył wektora z bilbioteki vector:
 

    vector<int> numbers;

    for (int i=0; i<n; i++)
    {
        int z;
        cin >> z;
        numbers.push_back(z);
    }

    sort(numbers.begin(), numbers.end(), division);

    for (int i=0; i<n; i++)
    {
       cout << numbers.at(i) << " ";
    }

wydaje mi się że błąd wyników pojawia się przez linijkę:
 

   if (d_a==d_b) return a<b;

zaimplementowałbym tutaj inne porównanie na wzór:
 

    if (d_a==d_b)
{
        if(a>b) return a>b;
        else if (a<b)  return a<b;
        else return a<b;
}

 

komentarz 2 października 2016 przez Blue Obywatel (1,180 p.)

Program działa do n=16, dla wyższych wartości napotyka jakieś problemy. Na przykład dla n=20 wyniki są takie:


1159497534
134260398
12
16
15
14
1
4
6
8
7
9
5
10
19
17
13
3
2
11

--------------------------------
Process exited after 13.53 seconds with return value 0
Aby kontynuować, naciśnij dowolny klawisz . . .

Obecnie kod wygląda tak:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

bool division (int a, int b) {

	int d_a=0; //liczba dodatnich dzielnikow liczby a
	int d_b=0; //liczba oddatnich dzielnikow liczby b

	for (int i=1; i<=a; i++) {

		if (a%i==0) d_a++;

	}

	for (int i=1; i<=b; i++) {

		if (b%i==0) d_b++;

	}

	if (d_a>d_b) return a>b;	
	if (d_a<d_b) return a<b;
	if (d_a==d_b) {
		
		if(a>b) return a>b;
		else if (a<b)  return a<b;
		else return a<b;
		
	}

}

int main () {

	int n;

	cin>>n;

	vector <int> numbers;

	for (int i=0; i<n; i++) {

		numbers.push_back(i+1);

	}

	sort(numbers.begin(), numbers.end(), division);

	for (int i=0; i<n; i++) {

		cout<<numbers[i]<<endl;

	}

	return 0;

}

 

Podobne pytania

0 głosów
1 odpowiedź 6,099 wizyt
0 głosów
1 odpowiedź 242 wizyt
0 głosów
1 odpowiedź 2,596 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...