1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida

Discussão em 'Programação' iniciada por Garnett, 24 de Outubro de 2007. (Respostas: 19; Visualizações: 1828)

  1. sera k alguem me pode dar umas luzes de como isto se faz?

    Um numero N é divisivel por 3 se a soma dos seus algarismos for tb ela divisivel por3. por exemplo, o numero N = 111111111 e divisivel por 3, pk a soma dos seus algarismos e igual a 1+1+1+1+1+1+1+1+1 = 9. S por sua vez a soma dos algarismos tiver + do k 1 algarismo, o processo recomeça. por exemplo o numero 1986 é divisivel por 3 pk 1+9+8+6 = 24 i 2+4= 6 e portanto sabese que 6 e divisivel por 3. os numeros reconhecidos como divisiveis por 3 sao 3, 6 e 9 . esta propriedade e util para testar a divisibilidade por 3 de grandes numeros formados por centenas de algarismos.
    Assim conceba um programa k peça ao utilizador um numero(sekuencia de algarismos) e k escreva no ecra a conclusao da sua divisibilidade por 3.

    Se alguem m puder ajudar bgd.
    ah e em C++
     
  2. AragTey

    AragTey Power Member

    Não é complicado de fazer...poe ai o que já tens feito que a malta dá umas dicas.

    Lê bem o enunciado e separa por fases .....faz uma espécie de psedu-codigo ou fluxograma em papel....vai ver que ajuda.
     
  3. slack_guy

    slack_guy Power Member

    Não vou fazer o teu trabalho de casa :p mas dou-te uma maõzinha em Perl (lê os comentários, pode ser que vejas a solução):
    Código:
    #!/usr/bin/perl 
    # FILE:  divisao_3.pl
    
    use strict;
    use warnings;
    
    # Lemos o numero...
    print "Digite um numero: ";
    
    # ... e armazenamos numa variavel
    my $numero;
    chomp($numero = <>);
    
    # Terminamos se os dados introduzidos tiverem algum caracter diferente de 0-9
    # IMPORTANTE: validar sempre os dados introduzidos!
    die qq|Numero incorrecto!\n| unless valida_numero($numero);
    
    calculo($numero);
    
    sub calculo {
    
    	my $self = shift;
    
    	# por cada ciclo, fazemos o reset ao total
    	my $total = 0;
    
    	# por cada digito incrementamos o total
    	$total += $_ foreach split //, $self;
    
    	# mostramos o total em cada ciclo
    	print qq|$total\n|;
    
    	# Se o total for superior a 9, reiniciamos o calculo, caso contrario,
    	# mostramos o resultado
    	if ( $total > 9 ) {
    		
    		calculo($total);
    
    	} else {
    
    		print "-" x 30, "\n", divisivel($total);
    
    	}
    
    }
    
    sub divisivel {
    
    	my $self = shift;
    
    	# se o numero for igual a 3, 6 ou 9 e divisivel
    	if ( $self=~/[3|6|9]/gmx ) { return qq|$self e' divisivel por 3\n|;}
    
    	# caso contrario nao e divisivel
    	return qq|$self nao e' divisivel por 3\n|;
    
    }
    
    sub valida_numero {
    
    	my $self = shift;
    
    	# So aceitamos digitos
    	if ($self =~/\D/gmx) { return }
    	return 1;
    
    }
    
    Resultado:
    Código:
    exemplo 1:
    
    $ perl divisao_3.pl
    Digite um numero: 23452345234523452345234
    79
    16
    7
    ------------------------------
    7 nao e' divisivel por 3
    
    #######################################
    
    exemplo 2:
    
    perl divisao_3.pl
    Digite um numero: 123235872345823945234752348523454534502349502380198098105483420958234502357230495782038457189712983572394857234587204578108975983475230457823045782304578230458723485
    729
    18
    9
    ------------------------------
    9 e' divisivel por 3
    
    #######################################
    
    exemplo 3:
    
    $ perl divisao_3.pl
    Digite um numero: vai dar banho ao cao!
    Numero incorrecto!
    
     
    Última edição: 24 de Outubro de 2007
  4. komo e k eu separo os numeros pa depois os somar 1 a 1
     
  5. Tens mesmo de fazer isso assim? Senão era mais prático usar o operador %...
     
  6. Aparicio

    Aparicio /dev/mod
    Staff Member

    Deverá ser por isto:
    Eu faço assim para somar os algarismos de um número em C:
    Código:
    int somar_algarismos(int numero)
        {
        int soma = 0;
        while(numero > 0)
            {
            soma += numero % 10;
            numero /= 10;
            }
        if(soma > 9)
            soma = somar_algarismos(soma);
        return soma;
        }
     
  7. mas isto n da pa fazer com assert. ou n tem nd haver com isso i to m a confundir
     
  8. n e complicado? j perdi umas horas nisto i n to mt bm a ver. mas temtar + 1 poko e inda vo conseguir depois vo pondo aki os progressos.
     
  9. TheRieper

    TheRieper Power Member

    tipo. a meu ver até é simples. crias um 2 strings ou qualquer outro tipo de variavel que te permita percorrer caracter a caracter o conteúdo. depois terás um vector que servirá temporariamente para armazenar os caracteres separados na string, ou seja, porás um por posição, num ciclo que irá desde 1 até o número de caracteres da string (ou seja terás que contar o número de caracteres da string,ou seja, o seu comprimento). dento deste mesmo ciclo vais actualizando uma variavel que se chamaria por exemplo soma com o valor da string na posição actual do ciclo (soma=soma+valor por ex.), vais fazendo isso até o comprimento da string ser um (ou seja também terás que ter uma condição lá no algoritmo). dps dessa condição tar satisfeita é só veres se é divisível por 3.
    Como podes ver até é bastante simples. Põem mãos à obra. já tens aí tudo explicadinho. não te dou mais senão dou tudo mesmo. agora cabe a ti desenvolver o algoritmo em pseudo-código, e o programa em si;)

    Abraço
     
  10. bgd. kuando tiver pronto ponho aki
     
  11. TheRieper

    TheRieper Power Member

    de nada. dps posta para eu ver como te saíste;P
     
  12. #include <iostream>
    using namespace std;

    int i, n, p;


    int main()
    {
    do{
    cout << "\nDe-me um numero maior que zero:" << endl;
    cin >> n;
    }while(n<=0);

    p = 0;
    for(n=n;n<10;n/10){
    p +=n%10;}

    if((p=3) || (p=6 || (p=9)))
    cout << "\nO numero que digitou e divisivel por 3:";
    else
    cout << "\nO numero que digitou nao e divisivel por 3:";

    system("pause");
    return(0);
    }



    tive alguns dias ocupado com outros. i depois de tempo a olhar pa isto fiz isto k me parece n ter nd a haver mas pelo menos n da erros de compilaçao. e da uma resposta (K e sempre a mesma).O numero que digitou e divisivel por 3.
    s alguem pudesse dar assim um dika pa começar d novo provavelmente.


    TheRieper tentei seguir as tuas dicas mas n consegui mas bgd na msm.
     
  13. TheRieper

    TheRieper Power Member

    Vi agora o teu post e vi uns erros. tou cheio de sono, hoje corrijo os que já vi e amanha dou-te uma maozinha na aula. Depois amanha explico-te o que te tinha dito pa fazer na aula de programação, porque provavelmente vou ficar sem fazer nada outra vez, o prof não dá programas de jeito pa fazer :007:

    Abraço
     
  14. Consu

    Consu Power Member

    cin >> n;
    Ler para um inteiro um número com centenas de digitos???

    if( (p=3) || (p=6 || (p=9)))
    Não seria if( p == 3 || p == 6 || p == 9 ) ???

    Código:
    #include <iostream>
    #include <string> [COLOR=DarkGreen]// Tens C++ e não usas strings???
    [/COLOR] 
    using namespace std;
    
    [COLOR=DarkGreen] // Para que precisas de variáveis globais???[/COLOR]
    
    int main() {
        unsigned int i, soma = 0;
        string numero;
        bool valid;
    
        do {
            cout << "\nIntroduza um numero maior que zero:" << endl;
            cin >> numero;
            valid = true; [COLOR=DarkGreen]// É um número válido até prova em contrário[/COLOR]
            
            [COLOR=DarkGreen]// Encontra o primeiro digito != '0'[/COLOR]
            for( i = 0; i < numero.size() && numero[i] == '0'; ++i );
    
            if( i == numero.size() || numero[0] == '-' ) [COLOR=DarkGreen]// Só 0's ou número negativo[/COLOR]
                valid = false; [COLOR=DarkGreen]// Ler outro número[/COLOR]
            else {
               numero = numero.substr( i ); [COLOR=DarkGreen]// Remove os zeros à esquerda[/COLOR]
    
               for( ; i < numero.size(); ++i ); [COLOR=DarkGreen]// Verifica se só contém dígitos[/COLOR]
                   if( numero[i] < '0' || numero[i] > '9' ) {
                       valid = false; [COLOR=DarkGreen]// Ler outro número[/COLOR]
                       break;
                   }
            }
    
        } while( !valid ); [COLOR=DarkGreen]// Número Inválido[/COLOR]
    
        for( i = 0; i < numero.size(); ++i )
            soma = ( soma + ( numero[i] & 0x0F ) ) % 9; [COLOR=DarkGreen]// 0x30-0x39 -> Cod. ASCII 0-9[/COLOR]
            [COLOR=DarkGreen]// ( a + b + c ) % d = ( ( ( a + b ) % d ) + c ) % d[/COLOR]
        
        if( soma == 0 || soma == 3 || soma == 6 )
            cout << "\nO numero que digitou e divisivel por 3:";
        else
            cout << "\nO numero que digitou nao e divisivel por 3:";
             
        return 0;
    }
    
     

  15. tenta usar o operador %. é mais simples e mais rapido.

    Código:
     
    if (num % 3 ) cout << "Numero nao divisivel" else cout << "numero divisivel";
     
    
    Espero isto te ajude. não tenho muito tempo pois estou a meio de uma aula... mas acho que a instrução que coloquei ai irá servir perfeitamente para o teu objectivo.
     
  16. AragTey

    AragTey Power Member

    pois...provavelemte no inicio é capaz de ser complicado, por isso te disse p fazeres no papel....para visualizares melhor o algoritmo, por vezes esta fase é desprezada, mas é muito importante.
    Sou contra por aqui codigo ,mas acreditando que já te dedicaste umas boas horas a isso fica aqui 1 pequeno execultavel que fiz para isto. Espero que te ajude, e podes melhorar um pouco o mesmo...

    Código:
    int main (void)
    {
       int    num;
       char   wait, read_num[200] = "";
    
       do 
       {
          num = 0;
          cout << "Digite numero\n";
          cin  >> read_num;
          sscanf(read_num, "%d", &num);
       } while (num <= 0);
    
       cout << "\nA processar numero " << num << "\n";
       num = 0;
    
       do
       {
          for (int i = 0 ; i < strlen(read_num) ; i++)
          {
             int num_aux;
             stringstream ss;
             ss << read_num[i];
             ss >> num_aux;
             num = num + num_aux;
          }
          if (num > 9)
          {
             sprintf(read_num , "%d", num);
             cout << "\nTem mais de dois algarismos: " << num << " vai correr nova iteracao\n";
             num = 0;
          }
       } while (num == 0);
    
       cout << "\nProcessou numero, resultado final " << num << "\n";
       if (num % 3) 
          cout << "Numero nao e divisivel por 3";
       else 
          cout << "Numero e divisivel por 3";
       cin  >> wait;
       return 0;
    }
    
     


  17. epa isto e mt a frente pa min inda n cheguei a este nivel.
    tem ai cenas k nunca vi como stringstream ss;
    mas assim j vo comaprando e aprendendo algumas coisas. bgd.
     
    Última edição: 6 de Novembro de 2007
  18. AragTey

    AragTey Power Member

    sim são tudo funcões de libs de C e C++.
     
  19. bm axo k perciso de mais uma pekena ajudinha
    kero calcular n!
    usando funçoes.

    eu fiz isto mas isto n ta a bater certo

    #include <iostream>


    using namespace std;

    float fact(float i){
    float mult;
    for(i=0; i>0;i--)
    mult *=i;
    return(mult);
    }



    int main()
    {
    float n, z;
    do{
    cout << "\nDe-me um numero positivo:" << endl;
    cin >> n;}
    while(n<0);

    cout << "\nO factorial de " << n << " e " << fact(n);

    system("pause");
    return (0);
    }

    sera ka lguem me podia dar uma ajuda para descobrir o erro.
    bgd
     
  20. Na função fact estás a pôr o argumento (i) como 0. Tira isso daí que deve funcionar. Além disso, a variável mult não está inicializada.
     

Partilhar esta Página