Ruka284 Posted March 6, 2013 at 12:21 PM Report #498101 Posted March 6, 2013 at 12:21 PM #include<stdio.h> #include <stdlib.h> int main() { int num,divisor; printf ("\n Introduza o numero \n"); scanf("%d",&num); while(num>0) { if (num%divisor == 0) printf("o numero %d e divisor de %d \n",divisor,num); divisor++; } system ("PAUSE"); return 0; } quais os erros que cometi?
HappyHippyHippo Posted March 6, 2013 at 12:30 PM Report #498104 Posted March 6, 2013 at 12:30 PM o de sempre : uso de variáveis não inicializadas IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Ruka284 Posted March 6, 2013 at 12:34 PM Author Report #498105 Posted March 6, 2013 at 12:34 PM o de sempre : uso de variáveis não inicializadas qual foi a variável que não foi declarada.
HappyHippyHippo Posted March 6, 2013 at 12:40 PM Report #498107 Posted March 6, 2013 at 12:40 PM eu não disse declarada, eu disse inicializada, são coisas completamente diferentes !!! enquanto que a primeira leva a erros de compilação, a segunda dá erros somente no momento de execução. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Ruka284 Posted March 6, 2013 at 12:50 PM Author Report #498110 Posted March 6, 2013 at 12:50 PM eu não disse declarada, eu disse inicializada, são coisas completamente diferentes !!! enquanto que a primeira leva a erros de compilação, a segunda dá erros somente no momento de execução. No meu compilador não da erros. Peço desculpa pela interpretaçao
HappyHippyHippo Posted March 6, 2013 at 12:51 PM Report #498111 Posted March 6, 2013 at 12:51 PM No meu compilador não da erros. a segunda dá erros somente no momento de execução. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Ruka284 Posted March 6, 2013 at 01:23 PM Author Report #498119 Posted March 6, 2013 at 01:23 PM qual o erro que te da?
HappyHippyHippo Posted March 6, 2013 at 02:15 PM Report #498123 Posted March 6, 2013 at 02:15 PM responde a esta pergunta : - que valor tem a variável divisor ? e porque ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
mundo Posted March 6, 2013 at 05:29 PM Report #498161 Posted March 6, 2013 at 05:29 PM #include<stdio.h> #include <stdlib.h> int main() { int num,divisor; printf ("\n Introduza o numero \n"); scanf("%d",&num); while(num>0) { if (num%divisor == 0) printf("o numero %d e divisor de %d \n",divisor,num); divisor++; } system ("PAUSE"); return 0; } quais os erros que cometi? divisor tem "lixo" quando fazes: if (num%divisor == 0) printf("o numero %d e divisor de %d \n",divisor,num); divisor++; } divisor que tem "lixo", fica "lixo"++ ou seja continua com "lixo"
netinhocqc Posted March 6, 2013 at 06:32 PM Report #498171 Posted March 6, 2013 at 06:32 PM int num = 0; int num = 0; outro erro a indentação.
thoga31 Posted March 6, 2013 at 07:08 PM Report #498174 Posted March 6, 2013 at 07:08 PM (edited) Outro erro: o ciclo é infinito se o utilizador introduzir um valor positivo não nulo. Não há uma condição de paragem funcional. Edited March 6, 2013 at 07:08 PM by thoga31 Knowledge is free!
Guest Markito Posted March 6, 2013 at 08:53 PM Report #498194 Posted March 6, 2013 at 08:53 PM (edited) Talvez a pergunta seja: calcular os divisores de 1 numero! Ando aqui á guerra com este problema e parece-me que tem que levar o ciclo for algures. como for(divisor=1;divisor<num;divisor++) Edited March 6, 2013 at 08:56 PM by Opaidacriança
thoga31 Posted March 6, 2013 at 09:00 PM Report #498197 Posted March 6, 2013 at 09:00 PM Sim, um ciclo terá de levar. Mas esse pode ser optimizado para ser 2x mais rápido (teoricamente falando). Knowledge is free!
Guest Markito Posted March 6, 2013 at 09:13 PM Report #498200 Posted March 6, 2013 at 09:13 PM Sem mérito da minha parte. Apenas estive a estudar um post do thinkabout acerca deste mesmo problema. Foi praticamente um copy & paste que fiz: #include<stdio.h> main() { int num,divisor; printf ("Introduza o numero\n"); scanf("%d",&num); for(divisor=1;divisor<=num;divisor++) { if (num%divisor==0) { printf("o numero %d e divisor de %d\n",divisor,num); } } } No entanto penso que compreendi... Sim, um ciclo terá de levar. Mas esse pode ser optimizado para ser 2x mais rápido (teoricamente falando). Então queres dizer que o ciclo for deve ser inicializado com 2 variáveis? É isso que queres dizer?
thoga31 Posted March 6, 2013 at 09:15 PM Report #498204 Posted March 6, 2013 at 09:15 PM Então queres dizer que o ciclo for deve ser inicializado com 2 variáveis? É isso que queres dizer? Nope. É matemática. Pensemos um pouco: qual é o menor divisor que um número poderá vir a ter, sem ser o 1? É o 2. Logo, o maior divisor de um número nunca será maior do que numero/2. Em código: for(divisor=1; divisor <= num / 2; divisor++) Pronto, é metade do ciclo que tu colocaste, e dará o mesmíssimo output 😉 Knowledge is free!
HappyHippyHippo Posted March 6, 2013 at 09:27 PM Report #498209 Posted March 6, 2013 at 09:27 PM Nope. É matemática. Se fores por esse caminho, sabes bem que os divisores de um número não são mais do que a multiplicação de todas as combinações possíveis dos valores de factorizarão do número ... será mais rápido, possivelmente, será o melhor para uma pessoa que está a começar, acho que não 😄 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Guest Markito Posted March 6, 2013 at 09:31 PM Report #498213 Posted March 6, 2013 at 09:31 PM (edited) Mas está bem visto. Valem as dicas para nos prepararmos para programar a sério! Obrigado Mas mesmo assim o que o hippo disse também é válido porque será melhor algumas vezes, no meu caso, não dar passos mais compridos que as pernas. Obrigado também Hippo! 😉 Edited March 6, 2013 at 09:36 PM by Opaidacriança
Rui Carlos Posted March 10, 2013 at 12:37 PM Report #498609 Posted March 10, 2013 at 12:37 PM Nope. É matemática. Pensemos um pouco: qual é o menor divisor que um número poderá vir a ter, sem ser o 1? É o 2. Logo, o maior divisor de um número nunca será maior do que numero/2. Atenção que o próprio número é seu divisor, pelo que a parte sublinhada não está propriamente correcta (apenas estaria correcta se se estivesse a falar de divisores próprios)... Quando se usa num/2, é necessário não esquecer este pormenor, pois vai haver mais um divisor. Se fores por esse caminho, sabes bem que os divisores de um número não são mais do que a multiplicação de todas as combinações possíveis dos valores de factorizarão do número ... Parece-me que será suficiente pegar no divisor mais pequeno, para se saber qual o maior. Também não é preciso complicar 😄 (É claro que isto só serve de alguma coisa, se deixarmos de fora o 1 e o próprio número.) Uma outra optimização possível, seria limitar o ciclo à raiz quadrada do número, e calcular dois divisores de cada vez (se d é divisor de n, então n/d também o é). Rui Carlos Gonçalves
thoga31 Posted March 10, 2013 at 04:49 PM Report #498634 Posted March 10, 2013 at 04:49 PM (edited) Atenção que o próprio número é seu divisor, pelo que a parte sublinhada não está propriamente correcta (apenas estaria correcta se se estivesse a falar de divisores próprios)... Quando se usa num/2, é necessário não esquecer este pormenor, pois vai haver mais um divisor. Pois, eu estava a excluir os dois divisores mais óbvios que qualquer número tem: o 1 e ele próprio. 🙂 Edited March 10, 2013 at 04:49 PM by thoga31 Knowledge is free!
Ruka284 Posted March 14, 2013 at 11:11 AM Author Report #499160 Posted March 14, 2013 at 11:11 AM #include<stdio.h> #include <stdlib.h> int main() { int num,divisor; printf ("\n Introduza o numero \n"); scanf("%d",&num); for (divisor=1;divisor<=num;divisor++) { if(num%divisor==0) { printf("o numero %d e divisor de %d \n", divisor,num); } } system ("PAUSE"); return 0; } Conclusao
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now