Nalezení počtu dělitelů posloupnosti bez použití pole – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nalezení počtu dělitelů posloupnosti bez použití pole – Java – Fórum – Programujte.comNalezení počtu dělitelů posloupnosti bez použití pole – Java – Fórum – Programujte.com

 

Honza
~ Anonymní uživatel
451 příspěvků
22. 12. 2016   #1
-
0
-

Ahoj, chtěl bych poprosit o pomoc, já už si nevmí rady. Mám zadaný úkol, že mám naprogramovat program, který bude zjišťovat, kolik prvků posloupnosti celých kladných čísel má stejný počet netriviálních dělitelů jako první prvek této posloupnosti (například 4 má jednoho dělitele, protože 1 a 4 se nepočítá, a dále je číslo dělitelné jen 2). Problém je, že nesmím použít typ pole.

Program mi už víceméně funguje, jenže v některých případech vyhazuje špatné výsledky. Funguje to tak, že pokud zadám například čísla 2 2 3 15, výsledek bude 2, protože první číslo 2 nemá netriviálního dělitele a další čísla, která mají stejný počet dělitelů (0) jsou 2 a 3, tedy dvě čísla. Problém nastává když zadám posloupnost, která má jen jedno číslo. Pokud zadám třeba 3, výsledek by měl být 0, protože nejsou žádná další čísla ke srovnávání. Jenže to nefunguje, pokud je zadané číslo prvočíslo. Prvočíslo mi jako výsledek dá 1 a ne požadovanou nulu. 

Chtěl bych tedy poprosit, jestli by mi mohl někdo poradit co s tím, nebo kde je chyba, já už si nevím rady.

public class Pocet {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int pocet = 0;
        int pocet2 = 0;
        int celkovypocet = 0;
        int pocetprvnihocisla = 0;
        int pocetdruhehocisla = 0;
        int cislo;
        System.out.println("Zadej kolik posloupností budeš zadávat. ");
        int count = sc.nextInt();
        System.out.println("Zadej čísla posloupnosti. ");
        for (int i = 0; i < count; i++) {
            int number = sc.nextInt();
            while (number > 0) {
                for (int k = 1; k <= number; k++) {
                    if (number % k == 0) {
                        pocet2++;
                        if (k == number) {
                            pocetdruhehocisla = pocet2 - 2;
                            if (pocetdruhehocisla < 0) {
                                pocetdruhehocisla = 0;
                            }
                            pocet2 = 0; 
                        }
                    }
                }
                if (pocetprvnihocisla == pocetdruhehocisla) {
                    celkovypocet++;
                }
                cislo = number;
                for (int j = 1; j <= cislo; j++) {
                    if (cislo % j == 0) {
                        pocet++;
                        if (j == cislo) {
                            pocetprvnihocisla = pocet - 2;
                            if (pocetprvnihocisla < 0) {
                                pocetprvnihocisla = 0;
                            }
                            pocet = 0;
                        }
                    }
                }
                number = sc.nextInt();
            }
            System.out.println(pocetdruhehocisla);
            System.out.println(pocetprvnihocisla);
            System.out.println(celkovypocet);
            pocetprvnihocisla = 0;
            pocetdruhehocisla = 0;
            celkovypocet = 0;
        }
    }
}
    
Nahlásit jako SPAM
IP: 2a00:1028:96d2:3baa:fc60:...–
gna
~ Anonymní uživatel
1891 příspěvků
22. 12. 2016   #2
-
0
-

Děcka, co nám to tady dneska rozjíždíte? :) V poli není žádný problém, ty prvky k ničemu později nepotřebuješ. A je přece jedno, že to je prvočíslo. Není s čím srovnávat, hotovo.

A hlavně, proč to nenapíšeš přesně tak, jak to má fungovat? Kolik dalších má stejně jako to první.

public static int pocetDelitelu(int cislo)
{
	int pocet = 0;
	for (int i = 2; i < cislo; i++) {
		if (cislo % i == 0) {
			pocet++;
		}
	}
	return pocet;
}

public static void main (String[] args)
{
	Scanner sc = new Scanner(System.in);
	int count = sc.nextInt();
	int pocetStejnych = 0;
	if (count > 0) {
		int pocetPrvniho = pocetDelitelu(sc.nextInt());
		for (int i = 1; i < count; i++) {
			if (pocetDelitelu(sc.nextInt()) == pocetPrvniho) {
				pocetStejnych++;
			}
		}
	}
	System.out.println("pocet stejnych " + pocetStejnych);
}
Nahlásit jako SPAM
IP: 213.211.51.–
Honza
~ Anonymní uživatel
451 příspěvků
22. 12. 2016   #3
-
0
-

To int count neznamená počet čísel v té posloupnosti, ale počet posloupností. Posloupnosti můžou být ibovolně dlouhé a můžu do ní zadávat čísla do aleluja, dokud nezadám nějaké záporné číslo (omlouvám se, to jsem zapomněl dopsat) .

Nahlásit jako SPAM
IP: 2a00:1028:96d2:3baa:bd73:...–
gna
~ Anonymní uživatel
1891 příspěvků
22. 12. 2016   #4
-
0
-

To už je celkem jedno. Jen se s tím netrap a napiš to jednoduše.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
22. 12. 2016   #5
-
0
-

   

public static void main (String[] args)
{
	Scanner sc = new Scanner(System.in);
	int count = sc.nextInt();
	for (int i = 0; i < count; i++) {
		int pocetStejnych = 0, cislo;
		if ((cislo = sc.nextInt()) >= 0) {
			int pocetPrvniho = pocetDelitelu(cislo);
			while ((cislo = sc.nextInt()) >= 0) {
				if (pocetDelitelu(cislo) == pocetPrvniho) {
					pocetStejnych++;
				}
			}
		}
		System.out.println(i + ": pocet stejnych: " + pocetStejnych);
	}
}
Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý