A dúvida é o seguinte , meu colega me passou esse código, que serve pra identificar se um valor digitado pelo usuário é primo ou não .
Só que o problema é que eu não entendo porque o código funciona , sacam? Não consigo entender qual a lógica por trás do algoritmo .
Segue o código :http://www.mediafire.com/view/?c2o477ach484kbd
Desde já agradeço.--
int main(void) { int n, c = 2; printf("informe o valor:"); scanf("%d",&n); for ( c = 2 ; c <= n - 1 ; c++ ) { if ( n%c == 0 ) { printf("numero composto"); break; } } if ( c == n ) printf("numero primo"); system("PAUSE"); return 0; }
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
Oi,Sou novo aqui, minha dica é para a logica do problema, seu contador não necessita ir até ao antecessor do numero inserido, basta ir só até a metade dele pois nenhum numero divisor será maior que sua metade.Espero ter ajudado.Raimundo
Em sábado, 4 de maio de 2013 13h56min24s UTC-3, João Guilherme Silva escreveu:
A dúvida é o seguinte , meu colega me passou esse código, que serve pra identificar se um valor digitado pelo usuário é primo ou não .
Só que o problema é que eu não entendo porque o código funciona , sacam? Não consigo entender qual a lógica por trás do algoritmo .
Segue o código :http://www.mediafire.com/view/?c2o477ach484kbd
Desde já agradeço.
int main(void) { int n, c = 2; printf("informe o valor:"); scanf("%d",&n); for ( c = 2 ; c <= n - 1 ; c++ ) { if ( n%c == 0 ) { printf("numero composto"); break; } } if ( c == n ) printf("numero primo"); system("PAUSE"); return 0; }
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
Boa noite!
Trava brincando de fazer exercícios do SPOJ pra praticar pra maratona INTERFATEC e descobri que quando o problema envolve número primo e performance o negócio é mais embaixo.
Estava tendo que aplicar todas as dicas matemáticas que reduzem o número de passos + cache para as soluções serem aceitas. Daí tive a brilhante ideia de calcular em tempo de compilação o número usando meta-programação por template, a compilação vai demorar um pouco mais, mas nessas competições o que conta é só o tempo de execução mesmo.
Alguém aí mais experiente tem alguma bala de prata pra verificar números primos?
Abraços!
#include <iostream> template<typename T> constexpr T divisors(T n, T c) { return !c ? 0 : !(n % c) + divisors(n, c - 1); } template<typename T> constexpr bool is_prime(T n) { return divisors(n, n) <= 2; } template<unsigned int n> struct print; template<> struct print<0> {}; template<> struct print<1> { inline static void primes() { std::cout << 1; } }; template<unsigned int n> struct print { inline static void primes() { print<n - 1>::primes(); if(is_prime(n)) std::cout << ", " << n; } }; int main() { print<1000>::primes(); std::cout << std::endl; }
E a questão dos números primos negativos? (Nunca entendi muito bem eles)
#include <limits> #include <iostream> #include <cinttypes> template<typename T> constexpr bool is_prime(T number, T limit, T counter) { return limit <= 1 ? true : counter >= limit && number % limit ? true : number % counter ? is_prime(number, number / counter, counter + 1) : false;
} template<typename T> constexpr bool is_prime(T n) {
return n <= 1 ? false : is_prime(n, n / 2, T{2}); } template<std::uint64_t n> struct print_below; template<> struct print_below<2> { inline static void primes() { std::cout << 2; } }; template<std::uint64_t n> struct print_below { inline static void primes() { print_below<n - 1>::primes(); constexpr bool is_n_prime = is_prime(n); if(is_n_prime)
std::cout << ", " << n; } }; int main() {
std::cout << "Some primes: \n"; print_below<8000>::primes(); std::cout << std::endl; // constexpr std::uint64_t large_number = 18446744073709551557ull; // // The following gets executed in runtime even with -O3. // Exceeding constexpr compile-time recursion limit makes is_prime to be evaluated at runtime // // std::cout << large_number << " is prime" << std::boolalpha << is_prime(large_number) << std::endl; // constexpr std::uint64_t large_number = 18446744073709551557ull; // // The following will not compile, since assigning to a constexpr variable // force compile-time evaluation, but is_prime can't be evaluated at compile-time // since its evaluation exceeds the constexpr compile-time recursion limit. // So assigning to a constexpr variable or using the expressing in constexpr contexts (like array bounds) // is the only safe way to assure things are evaluated at compile-time. // // constexpr bool is_large_number_prime = is_prime(large_number); // // if(is_large_number_prime) // std::cout << large_number << " is prime" << std::endl; // else // std::cout << large_number << " is not prime" << std::endl; // This is the largest prime that can be calcutated with is_prime at compile-time on // clang version 3.4 (trunk 183073) with the default -fconstexpr-depth=512 // constexpr std::uint32_t large_number = 262139; // This one won't compile anymore, increase with -fconstexpr-depth option. constexpr std::uint32_t large_number = 262147; constexpr bool is_large_number_prime = is_prime(large_number); if(is_large_number_prime) std::cout << large_number << " is prime" << std::endl; else std::cout << large_number << " is not prime" << std::endl; }
Ah e a respeito de algumas respostas anteriores, 1 não é primo (acho que vi um programa ali que o considera primo).[]'s
Ah e a respeito de algumas respostas anteriores, 1 não é primo (acho que vi um programa ali que o considera primo).[]'sfixed
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
Murilo,
Vocês têm razão. Vou ficar com a versão em inglês da Wikipédia, mais confiável!
Obrigado.
Muito legal isso! (Precisava dizer isso)
Nada de mais, é o mesmo princípio do inicial com prints, apesar da lógica curta, a template recursiva vai gerar um código objeto burro que não passa de uma lista de comandos com utilizando os primos pré-calculados. No final, o executável é só uma lista de couts/push_backs somente de primos.
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 10 001st prime number?
T+
template<typename T> constexpr bool is_prime(T number, T limit, T counter) {
return counter >= limit ? number % limit != 0 : number % counter ? is_prime(number, number / counter, counter + 2)
: false; } template<typename T> constexpr bool is_prime(T n) {
return n == 2 || n == 3 || n == 5 ? true : n <= 1 || n % 2 == 0 ? false : is_prime(n, n / 3, T{3}); }