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

NAPRAWDĘ duże liczby pierwsze :P

Cloud VPS
0 głosów
867 wizyt
pytanie zadane 3 stycznia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

Cześć :)

Treść zadania jest taka:

Napisz program do wyszukiwania największej liczby pierwszej w ciągu cyfr, stanowiących liczbę podaną przez użytkownika z klawiatury.

Przygotuj funkcję, która znajdzie największą liczbę pierwszą, będącą fragmentem liczby number. Funkcja powinna zwrócić znalezioną liczbę lub 0, w przypadku kiedy takiej liczby nie uda się znaleźć. Prototyp funkcji powinien wyglądać następująco:

unsigned long long find_largest_prime_number(unsigned long long number);

Napisz program, który pobierze od użytkownika liczbę a następnie, wykorzystując przygotowaną wcześniej funkcję find_largest_prime, wyświetli największą liczbę pierwszą, stanowiącą fragment wczytanej liczby. W przypadku podania błędnych danych program powinien wyświetlić komunikat Incorrect input i zakończyć działanie z kodem błędu 1.

Uwaga!

  • W programie nie wolno używać słowa kluczowego char.
  • W programie nie wolno używać zmiennych statycznych oraz globalnych.
  • W programie nie wolno używać funkcji z biblioteki stdint oraz cstdint,
  • W programie nie wolno używać tablic.

Przykładowe wejście:

Podaj liczbe:
1320

Przykładowe wyjście:

13

Rozpisałem więc kod:

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
unsigned long long is_prime(unsigned long long a);
unsigned long long find_largest_prime_number(unsigned long long number);
int main() 
{
	unsigned long long zmienna1;
	unsigned long long wynik;
	printf("Podaj swoja liczbe: ");
	if(scanf("%llu",&zmienna1)!=1)
	{
		printf("Incorrect input");
		return 1;
	}
	wynik=find_largest_prime_number(zmienna1);
	printf("%llu",wynik);
	return 0;
}
	 

unsigned long long is_prime(unsigned long long a)
{
	unsigned long long s;
	int kontrola=0;
	for(s=a;s>=1;s--)
	{
		if(a%s == 0)
		{
			kontrola++;
		}
		
    if(s==1 && kontrola==2)
	{
	return 1;
	}	  
	}
	return 0;
}
unsigned long long find_largest_prime_number(unsigned long long number)
{
	dalej:
	if(number==0)
	{
		return 0;
	}
	else
	{
		if(is_prime(number)==1)
		{
			return number;
		}
		else
		{
			//return find_largest_prime_number(number/10);
			number=number/10;
			goto dalej;
		}
	}
	return 0;
}

I wszystko by się wydawało okej. Dla 1320 znajduje 13. Na testach jednak nie przechodzi to dla takiej liczby:

70736

gdzie powinno być 73, a jest

7

Pytanie, jak mogę usprawnić swój kod, aby uwzględnić tą trójkę z przodu?

 

2 odpowiedzi

0 głosów
odpowiedź 5 stycznia 2020 przez Karpik Użytkownik (680 p.)

spróbuj Sita Eratostenesa: https://pl.wikipedia.org/wiki/Sito_Eratostenesa

0 głosów
odpowiedź 5 stycznia 2020 przez ArekRGW Użytkownik (680 p.)
edycja 5 stycznia 2020 przez ArekRGW
Dzielisz tylko przez 10. Spróbuj w pętli dzielić potem przez 100, 1000, 10000 ... A potem usunąć ostatnią cyfrę z tej długiej liczby itd... Tylko uważaj na wydajność bo Dante lubi przerwać program w tym zadaniu.

Podobne pytania

0 głosów
0 odpowiedzi 573 wizyt
pytanie zadane 6 stycznia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
0 odpowiedzi 498 wizyt
pytanie zadane 7 maja 2020 w C i C++ przez anon1234 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 470 wizyt
pytanie zadane 19 sierpnia 2020 w SPOJ przez Billy Użytkownik (680 p.)

93,463 zapytań

142,459 odpowiedzi

322,727 komentarzy

62,840 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

Kursy INF.02 i INF.03
...