Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj,
právě programuji funkci na test, zda zadané číslo je či není prvočíslem. Otázka je, zda pro záporné vstupní hodnoty a nulu má funkce vracet pouze False (jako wolframalpha) nebo má rovnou varovat, že se jedná o nepovolenou vstupní hodnotu (vyvolat výjimku Value Error)?
Které tvrzení je tedy správné? Nula není prvočíslo nebo nelze rozhodnout o prvočíselnosti nuly? Které chování je korektnější? (Z uživatelského hlediska - bylo-li zadáno záporné číslo, myslel to uživatel vážně, nebo se jedná o pravděpodobnou chybu?)
A abych nezapomněl - zdravím zdejší osazenstvo ;)
Offline

↑ FailED:
Jsem téhož názoru. Hodnoty menší než 1 (včetně, tedy menší nebo rovno) 1 nejsou v žádném případě prvočísla
Offline
↑ vojta.rylko:
Taktiež zdravím,
Teda ak som správne pochopil...
Ak je úlohou programu resp. funkcie zistiť či je získané číslo prvočíslo, tak určite hodnoty menšie ako jedna(väčšie ako dva) prvočísla nie sú...
Môže nastať situácia kedy si spustí program niekto, kto nevie aké môžu byť prvočísla a určite skúsi aj záporné hodnoty a čaká odpoveď...Takže určite nejde o nepovolenú vstupnú hodnotu...a či už to zadal neúmyselne alebo úmyselne to nijako nezistíš...
Offline
Dá se tedy říct, že prvočísla nejsou i 3.5, -10.3 atd... Díky
Offline

↑ vojta.rylko:
Ano, správně :) NEJSOU. Z jednoho prostého důvodu:
Prvočíslo je takové přirozenéčíslo, které je dělitelné pouze 1 a sebou samotném (má Právě dva různé přirozené dělitele
Z definice prirozených čisel tedy plyne co?
Ohledně algoritmu - do pozadavku na zadání parametru bych jasně napsal userovi (i neznalému prvočísel) Něco ve smyslu "Zadej jakékoliv přirozené číslo" - z toho snad i tupec pochopí, že má zadat celé a kladné číslo :) Jinak, chceš-li to mít opravdu blbovzdorný, tak pozor na datové typy, když to hodíš do int (integer, nebo v čem to píšeš), tak jazyky mají tendenci desetinnou číst zahazovat. 3,1 = 3 (nebylo zadáno prvočíslo, program bude pracovat s 3 - vrátí že je prvočíslo) 3,7 má stejný problém. INT všechno, co je za čárkou(tečkou) zahodí a neví co tom. Takže typ double a test na celočíselnost a kladnost
Offline
↑ vojta.rylko:
Ako už vraví kolega ↑ frank_horrigan:
Definícia prvočísla je jasná: Prvočíslo je prirodzené číslo(1,2,3,4,5...), ktoré je bez zbytku deliteľné práve dvoma rôznymi prirodzenými číslami, a to číslom jedna a sebou samým (tedy 1 prvočíslo nie je)
Offline
↑ vojta.rylko:
Já bych to programátorsky řešil takto: (v Pascalu)
var n: Integer;
repeat //Dokud se nezada cislo porad opakujeme zadani
try
WriteLn;
Write(' Zadej prirozene cislo vetsi nez 1: ');
ReadLn(n);
except
on EInOutError do //Osetrení spatnych vstupu-napr.pismena,
begin //nebo cisla vetsi nez 2147483647 (rozsah Integer) nebo desetinna
WriteLn(' Cislo musi byt prirozene vetsi nez 1');
n := -1;
end;
end;
until n<>-1;
if n<=1 then //Pokud zadame cislo, ktere neni prirozene a vetsi nez 1
repeat //tak to nedovolime
WriteLn(' Cislo musi byt prirozene vetsi nez 1');
WriteLn;
Write(' Zadej prirozene cislo vetsi nez 1: ');
ReadLn(n);
until n>1;
Jinak prvočísla mohou být opravdu pouze přirozená čísla větší než jedna
Offline

Já v céčku (++, ANSI 2000 a lepší) takto
#include <iostream>
using namespace std;
bool IsPrime(num);
void main()
{
int compare;
double enter;
bool prime =false; //pokud neprojdeme testy, okamzite else z posledniho if
cout << "Zadej prirozene cislo\n"
cin >> number;
compare = number;
if ((compare-number) != 0) // test zda vstup neni desetinne cislo
{
cout << "Zadne destiine cislo neni prvocislo\n";
}
if( number < 1) //test na zaporne/0
{
cout << "Zadne zaporne nebo 0 neni prvocislem\n";
}
else //vse ok
{
prime =IsPrime(number);
}
if (prime == true)
{
cout << "Zadane cislo " << number << "JE prvocislem\n";
}
else
{
cout << "Zadane cislo " << number << "NENI prvocislem\n";
}
return;
}
Definice funkce IsPrime() se mi fakt psat nechce :), jenom česky, argument zkusim hodit modulo ruznymi deliteli (treba v cyklu s inkrementem o 1, ale klidne i elegantneji), pokud v nejakem vyjde modulo 0 (beze zbytku), cyklus okamzite konci s vystupem false
Offline
↑ frank_horrigan:
Já céčko neumím, tak jenom pro moje vzdělání:
Tím tvým kódem jsou ošetřeny všechny případy?
Mám na mysli:
1. vstup není číslo, ale např. písmeno.
2. vstup je sice typu Integer, ale větší než rozsah Integer.
3. vstup je sice v rozsahu Integer, ale menší než 2. (-nek.,1>
4. vstup je desetinné číslo (kladné nebo záporné)
Za odpověď děkuji.
Offline
Nemáte někdo zkušenosti s algoritmem pro klasifikaci prvočíselnosti? Který je vhodný pro implementaci v C? Na výběr je podle anglické wiki více než deset algoritmů...
Offline
↑ frank_horrigan:
Toto čo si napísal je C++ a nie C...len tak pre objasnenie ;).
↑ vojta.rylko:
Bohužiaľ nie, skúsenosti nemám...
↑ frank_horrigan:
EDIT: Hneď to lepšie vyzerá, keď je tam to ++ ;).
Offline

↑ Honzc:
Písmeno jsem neosetroval, nevim jestli lze ulozit pismeno (resp. jeji ASCII reprezent) do double, myslim ze neulozi, neprojde testem na zapornost a celociselnost a tak se fce IsPrime ani nezavola - ale dobrá poznámka k zamyšlení, časem zkusím.
ad 2) ukládám do double, tedy na 32(?) bitů, toho rozsah "normalni uzivatel" neprekroci - u tak velkych cisel (a zvlast kdyz by se "trefilo" prvocislo by trvalo testovani kur**ky (pardon, lepsi vyraz mne nenapada) dlouho - bylo by dobré ovšem uvést v "dokumentaci k progamu", nebo v nejakych poznamkach
ad 3) testuji, dodal jsem tam commenty - jeste k té 1 (cokoli mensiho neprojde ifem) - zavola funkci IsPrime a zjisti, ze má jenom za delitele jenom tu 1 -> prime = false; return(prime); Dobre definovat az v tele funkce, jinak samozrejme staci testovat cisla (a odfiltrovat cisla <2)
ad 4) totez
EDIT: ↑ hradecek: máš pravdu, spíš překlep než blbost... A "drsňácký" céčko nemá cout, ale printf() apod.... Edituji :) Lepší? :)
EDIT 2: ↑ vojta.rylko: Ty algoritmy neznam, tedy ani zkusenost mít nemohu, jeden jednoduchy (leč šíleně pomalý, uznávám) jsem příspěvek výše navrhl :)
Offline
hradecek (#7) napsal(a):
Definícia prvočísla je jasná: Prvočíslo je prirodzené číslo(1,2,3,4,5...),
ktoré je bez zbytku deliteľné práve dvoma rôznymi prirodzenými číslami,
a to číslom jedna a sebou samým (tedy 1 prvočíslo nie je)
Neodpustim si rýpnutí, jednička se za prvočíslo nepovažuje.
Offline

↑ byk7:
Tak si taky rýpnu - ani čtyřka :-). hradecek v závorce chtěl ukázat přirozená čísla, ne prvočísla.
Offline
↑ byk7:
Ano kolega ↑ BrozekP: to pochopil, chcel len poukázať že hladať prvočísla medzi celými alebo reálnymi číslami je hlúposť...a keby si si to prečítal dokonca tak v zátvorke je napísané
"teda 1 prvočíslo nie je"
Offline
Vyřešeno, konec flajmu ;)
Nakonec jsem použil Miller–Rabin primality test (pravděpodobnostní verzi), testováno pro 600-ti ciferné prvočísla a v pořádku.
Offline
Stránky: 1