Duvida

Garnett

Membro
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++
 
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.
 
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:
Tens mesmo de fazer isso assim? Senão era mais prático usar o operador %...
Deverá ser por isto:
esta propriedade e util para testar a divisibilidade por 3 de grandes numeros formados por centenas de algarismos.

komo e k eu separo os numeros pa depois os somar 1 a 1

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;
    }
 
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.
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.
 
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
 
#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.
 
#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){ //penso que não faz grande sentido usares N para contar e iguala-lo a N visto que ele já é N. deverias usar (i=n; i<10;i/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"); //poem getch, é mais útil. o comando é getchar() ou getch(), ou getche(). varia com os IDEs. Para o usares incluis a libraria conio.h.
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.

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
 
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;
}
 
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++


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.
 
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.

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;
}
 
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;
}



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:
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
 
Back
Topo