• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nando_ice

numeros pares

30 mensagens neste tópico

Boas pessoal voltei de novo com uma nova questa!

tenho e seguinte exercicio:

Elaborar um programa que determine todos os numeros pares entre dois numeros inteiros n e m(n<m)!

Eu ja fiz o programa so k eu insiro os valores e ele nao me devolve nada...

é o seguinte o programa:

#include <stdio.h>
main()
{
int n,m,contador=0,num=0;

printf("introduza o n: ");
scanf("%d",&n);

printf("introduza o m: ");
scanf("%d",&m);

while (n<=m)
{
	if(n%2==0)
	{
		num=n/2;
		contador++;
	}
}return contador;

printf("%d",contador);

}

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro esse programa é mais C do que C++. Depois, covem indicar que tipo de valor retorna o main (int ou void). O valor que a função main retorna não será usado para nada, logo, assim que fazes "return contador;" o programa termina, não chegando a apresentar o valor do contador.

Experimentar tirar essa linha e meter so no final "return 0;", sendo "int main()" no início.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o programa não faz muito sentido...

o valor de n nunca é alterado, se entras no ciclo, nunca mais de lá sais...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Queres saber quais são ou quantos são os números pares?

Para que serve a linha

			num=n/2;

? Não devias estar antes a incrementar o n?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uma coisa, so mm pra nao tar a abrir um novo topico na biblioteca math há alguma função para a raiz cúbica ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
CBRT(3)                  BSD Library Functions Manual                  CBRT(3)

NAME

    cbrt -- cube root function

SYNOPSIS

    #include <math.h>

    double

    cbrt(double x);

    long double

    cbrtl(long double x);

    float

    cbrtf(float x);

DESCRIPTION

    The cbrt() function computes the cube root of x.

SPECIAL VALUES

    cbrt(+-0) returns +-0.

    cbrt(+-infinity) returns +-infinity.

SEE ALSO

    math(3), sqrt(3)

STANDARDS

    The cbrt() function conforms to ISO/IEC 9899:1999(E).

BSD                            January 21, 2003                            BSD

só mais um pormenor...

"...na biblioteca math á uma função..." :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
CBRT(3)                  BSD Library Functions Manual                  CBRT(3)

NAME

    cbrt -- cube root function

SYNOPSIS

    #include <math.h>

    double

    cbrt(double x);

    long double

    cbrtl(long double x);

    float

    cbrtf(float x);

DESCRIPTION

    The cbrt() function computes the cube root of x.

SPECIAL VALUES

    cbrt(+-0) returns +-0.

    cbrt(+-infinity) returns +-infinity.

SEE ALSO

    math(3), sqrt(3)

STANDARDS

    The cbrt() function conforms to ISO/IEC 9899:1999(E).

BSD                            January 21, 2003                            BSD

só mais um pormenor...

"...na biblioteca math á uma função..." :hmm:

Pequena e última correcção, já que estamos numa de nos corrigir: "....na biblioteca math uma função..." :hmm:

O programa falado no primeiro post está totalmente em C, pelo que vai passar para a secção correcta. Alguma notificação, façam-no por pm por favor. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pequena e última correcção, já que estamos numa de nos corrigir: "....na biblioteca math uma função..." :hmm:

eu não corrigi nada!!!

apenas copiei...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pequena e última correcção, já que estamos numa de nos corrigir: "....na biblioteca math uma função..." :hmm:

eu não corrigi nada!!!

apenas copiei...

Ups...peço então desculpa pelo equívoco.

Chega de offtopic... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas eu ando a trabalhar em c++ e desejava k o programa fosse feito em c++, nao em c. apesar das linguagens nao diferenciarem mt!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas eu ando a trabalhar em c++ e desejava k o programa fosse feito em c++, nao em c. apesar das linguagens nao diferenciarem mt!

as duas linguagens até são consideravelmente diferentes...

...o problema é que você não utilizou nada de C++ que não seja C também, mas o programa vai compilar na mesma em C++.

e quanto ao programa, já funciona?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então, se queres fazer isso em C++, podes usar código mais próximo do "the c++ way" ;-)

#include <iostream>
using namespace std;

int main()
{
int n, m;
cout << "N = ";
cin >> n;
cout << "M = ";
cin >> m;

while (n <= m)
{
	if (0 == (n % 2))
	{
		cout << n << ' ';
	}
	++n;
}
cout << endl;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pah, numeros pares são os números de dois em dois, não é preciso verificações de múltiplo de 2 ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pah, numeros pares são os números de dois em dois, não é preciso verificações de múltiplo de 2 ou não.

é uma boa observação, só precisamos de saber se o primeiro é par ou não...

até porque a divisão é uma operação ineficiente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro, perde-se bastante do rendimento do programa ao andar a fazer divisões.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include <stdio.h>
int main(){	
int n,m,i; 	
do{
printf("introduza o n: ");
scanf("%d",&n); 

printf("introduza o m: ");	
scanf("%d",&m);
}while(n<m);

for(i=n; i<=m; i++){
if(i%2==0)
  printf("%d",i);
}
return 0;
}

encontrei isto resolvido no meu caderno... nao tinha nada a ver com o k eu estava a fazer! :down:

e tem razao c e c++ sao diferentes eu por vezes confunco a linguagem.

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só tens que verificar o último bit.. se é  0 ou não. A operação de mod é construida à base de operações de shitfs de bits mas posso estar enganado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como ja disseram existem pares de dois em dois, logo isto chega


unsigned long n,m;
printf("saber numeros pares entre ");
scanf(" %d",&n);
printf(" e ");
scanf(" %d",&m);

num=!(n&1) + !(m&1); /*  Se o n é par, !(n&1)=1
para saber os numeros pares entre eles: */

num+=((n>m?n:m)-(n>m?m:n))/2-(num==2?1:0);
printf("\n Existem %d numeros pares!\n",num);

[ ]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como ja disseram existem pares de dois em dois, logo isto chega


unsigned long n,m;
printf("saber numeros pares entre ");
scanf(" %d",&n);
printf(" e ");
scanf(" %d",&m);

num=!(n&1) + !(m&1); /*  Se o n é par, !(n&1)=1
para saber os numeros pares entre eles: */

num+=((n>m?n:m)-(n>m?m:n))/2-(num==2?1:0);
printf("\n Existem %d numeros pares!\n",num);

[ ]

Este método funciona bem se for um intervalo de números seguidos. no entanto se for um conjunto de números introduzidos pelo utilizador penso que o método da comparação com o  "resto da divisão" seja das únicas soluções. Digam-me  se estiver enganado...

Ps: Desenterrei este tópico pois tenho de fazer um programazito do genero lá pá UNI e penso que esta seja a forma mais acertada face ao meu problema (sendo um conjunto de números introduzidos pelo utilizador). No entanto, se existir um método mais eficiente digam-me, pois o meu Prof mais do que por um programa a funcionar quer a melhor solução.....

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este método é uma optimização para intervalos de números. Para números arbitrários, tens que percorrer todos os números inseridos e usar ou o resto da divisão por 2, ou a verificação do último bit. Nesse sentido, ambos os métodos funcionam.

No entanto, e como já falaram por aí em performance, computacionalmente falando, fazer um and bit a bit é muito mais rápido que obter o resto da divisão, por isso é aconselhável o último método.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este método é uma optimização para intervalos de números. Para números arbitrários, tens que percorrer todos os números inseridos e usar ou o resto da divisão por 2, ou a verificação do último bit. Nesse sentido, ambos os métodos funcionam.

No entanto, e como já falaram por aí em performance, computacionalmente falando, fazer um and bit a bit é muito mais rápido que obter o resto da divisão, por isso é aconselhável o último método.

Já para não falar que não se vai fazer o and a todos os bits, mas somente a um deles.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este método é uma optimização para intervalos de números. Para números arbitrários, tens que percorrer todos os números inseridos e usar ou o resto da divisão por 2, ou a verificação do último bit. Nesse sentido, ambos os métodos funcionam.

No entanto, e como já falaram por aí em performance, computacionalmente falando, fazer um and bit a bit é muito mais rápido que obter o resto da divisão, por isso é aconselhável o último método.

Já para não falar que não se vai fazer o and a todos os bits, mas somente a um deles.

:| como fazes isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(a & 1) retorna 1 se "a" for ímpar e 0 se "a" for par.

Basicamente retorna 1 se o último bit (o bit menos significativo de "a") for 1, e é exactamente isso que distingue um número ímpar de um número par.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(a & 1) retorna 1 se "a" for ímpar e 0 se "a" for par.

Basicamente retorna 1 se o último bit (o bit menos significativo de "a") for 1, e é exactamente isso que distingue um número ímpar de um número par.

De facto, só interessa o último bit, mas o and  ( a & 1 ) , faz o and a todos os 32 bits. Não podes fazer só a um deles.

De qualquer modo, (segundo um prof) já há vários anos que os processadores têm unidades que fazem os shifts directamente. Assim, fazer o and de 1 bit é igual a fazer um and a 32 bits

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(a & 1) retorna 1 se "a" for ímpar e 0 se "a" for par.

Basicamente retorna 1 se o último bit (o bit menos significativo de "a") for 1, e é exactamente isso que distingue um número ímpar de um número par.

Nao sabia dessa..Mas muito bem visto..Já agr nao existe pa testar se o ultimo bit é 0 né?É que troquei a condição as o programa nao executava direito....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora