Ir ao conteúdo
  • Cadastre-se
CHeed

Assembly Algoritmo número primo após e antes

Posts recomendados

O algoritmo em questão é esse:

 

Fazer um algoritmo que receba um número (1 < número <= 50000) e demonstre o primeiro número primo após a ele e o primeiro número primo antes dele.

 

Tenho que fazer ele em Assembly, porém fiz um teste primeiro em macro porquê foi onde eu aprendi consegui mostrar o numero primo antes do número digitado entretanto, não faço ideia de como chegar no valor após ele se alguém puder ajudar.

 

 

Isso foi o que consegui fazer:

 

Sub Primo()
Dim i As Integer
Dim n As Integer
Dim j As Integer
Dim r As Integer
Dim cont As Integer

n = InputBox("Digite um número entre 1 e 50000: ")

If n < 1 Then

MsgBox ("Digite um valor correto.")

n = InputBox("Digite um número entre 1 e 50.000: ")

Else
    If n > 50000 Then
       MsgBox ("Digite um valor correto.")
       n = InputBox("Digite um número entre 1 e 50.000: ")
       End If
       End If    
       For i = 1 To n
          cont = 0
            For j = 1 To i
             If i Mod j = 0 Then
             cont = (cont + 1)
             End If
             Next
             If cont = 2 Then
             r = i
             End If
             Next 
             MsgBox ("O primo antes do número digitado é: " & r)
End Sub


 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CHeed    nesse VBA ainda  não fiz o hello word ,  mas na linguagem c esse código poderia ser assim  :

#include <stdio.h>
int num,j,f,antes,depois,flag;
int verifica(){
    int res=j;
    flag=1;           /* informa que o numero é primo */
    for(f=2;f<j;f++){
        if( j % f == 0 ){
            flag=0;   /* informa que o numero não é primo */
            break;
        }
    }
    if(flag)res=j;    /* se flag é verdadeiro informa que numero é primo */
    return res;
}
int main(){
    printf("digite o numero Maior que 1 e Menor que 50001 ");
    do{
        scanf("%d",&num);
        if(num<1 || num>50000)printf("Por Favor Outro Numero !\n");
    }while(num<1 || num>50000);
    for(j=num-1;j>1;j--){
        antes=verifica();   /* primeiro numero primo antes do número digitado  */
        if(flag)break;
    }
    for(j=num+1;j<50001;j++){
        depois=verifica();  /* primeiro numero primo depois do número digitado */
        if(flag)break;
    }
    if(num>2)
        printf("\n\nO Primeiro numero primo antes de %d eh %d e depois eh %d\n\n",num,antes,depois);
    else{
        printf("\nA convencao eh de que só existe numeros primos positivos e maiores que zero,\n");
        printf("entao sendo assim , nesse caso nao existe um numero primo Menor Que 2  !\n\n");
        printf("Mas Nesse Site :\n\n -> ");
        printf("http://www.profcardy.com/perguntas-frequentes-matematica/tirateima.php?id=2\n\n");
        printf("tem informcoes de que numeros negativos podem ser primos tambem . ");
        printf("e nesse caso  esse codigo precisa de ajustes .\n");
        printf("\n\nMas o Primero Numero Primo Maior Que %d eh %d\n\n\n",num,depois);
    }
    return 0;
}

aqui no vba macro  poderia ser assim  :

Sub Primo()
Dim i As Long
Dim g As Long
Dim n As Long
Dim j As Long
Dim antes  As Long
Dim depois As Long
Dim achou  As Integer

n = InputBox("Digite um número entre 1 e 50000: ")

If n < 1 Then
  MsgBox ("Digite um valor correto.")

n = InputBox("Digite um número entre 1 e 50.000: ")

Else
    If n > 50000 Then
       MsgBox ("Digite um valor correto.")
       n = InputBox("Digite um número entre 1 e 50.000: ")
    End If
End If
For i = n - 1 To 2 Step -1
  achou = 1
  For j = 2 To i - 1
    If i Mod j = 0 Then
      achou = 0
      j = i + 1 ' para sair do loop
    End If
  Next
  If achou = 1 Then
    antes = i
    i = 0
  End If
Next
For i = n + 1 To 50050  ' integer só pode ir até esse valor 32766
  achou = 1
  For j = 2 To i - 1
    If i Mod j = 0 Then
      achou = 0
      j = i + 1
    End If
  Next
  If achou = 1 Then
    depois = i
    i = 50050    ' para sair do loop
  End If
Next
If antes = 0 Then
  MsgBox ("A conveção é de que só existe números primos positivos , Sendo assim não existe hum número primo antes desse 2 . Mas O primo depois do número digitado é: " & depois)
Else
  MsgBox ("O primo antes do número digitado é: " & antes)
End If
MsgBox ("O primo depois do número digitado é: " & depois)
End Sub

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Consegui fazer terminar o código hoje sozinho, porém agora queria ajuda pra passar pra Assembly mesmo

não consigo entender muito bem como funciona os laços em Assembly.

 

meu código finalizado ficou assim:

 

'Fazer um algoritmo que receba um número (1 < número <= 50000) e demonstre o primeiro número primo após a ele e o primeiro número primo antes dele.

Sub Primo()
Dim i As Integer
Dim n As Integer
Dim j As Integer
Dim antes As Integer
Dim cont As Integer
Dim depois As Integer

n = InputBox("Digite um número entre 1 e 50000: ")

If n = 2 Then
   MsgBox ("Não há número primo antes dele.")
   GoTo depois:
   End If
   
If n < 1 Then

MsgBox ("Digite um valor correto.")

n = InputBox("Digite um número entre 1 e 50.000: ")

Else
    If n > 50000 Then
       
       MsgBox ("Digite um valor correto.")

       n = InputBox("Digite um número entre 1 e 50.000: ")
       
       End If
       End If
             
       For i = 1 To n
       
          cont = 0
          
            For j = 1 To i
            
             If i Mod j = 0 Then
             
             cont = (cont + 1)
             
             End If
             
             Next j
             
             If cont = 2 Then
             
             antes = i
             
             End If
             
             Next i
             
             MsgBox ("O primo antes do número digitado é: " & antes)
             
             
depois:
             For x = 1 To n
             
                 n = n + 1
                    
             For i = n - 1 To n
       
          cont = 0
          
            For j = 1 To i
            
             If i Mod j = 0 Then
             
             cont = (cont + 1)
             
             End If
             
             Next
             
             If cont = 2 Then
             
             depois = i
             
             x = n
             End If
             
             Next
             Next
             
             MsgBox ("O número primo depois do número digitado é: " & depois)
             
End Sub

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CHeed    sinto muito mas seu código não funciona ,  pois você usou variáveis integer ,   quando elas precisam ser do tipo long para suportar valores maiores que 32767. e as long podem ir até 2.147.483.647.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 porém a logica está correta é so arrumar as variaveis?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CHeed    você está usando o cont para contar a quantidade de números que não são primos , e a quantidade de números entre um primo e outro não é sempre igual .

    Qual compilador você está usando para o assembler ?    seria o  neander win ?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010

20 minutos atrás, devair1010 disse:

@CHeed    você está usando o cont para contar a quantidade de números que não são primos , e a quantidade de números entre um primo e outro não é sempre igual .

    Qual compilador você está usando para o assembler ?    seria o  neander win ?

não entendi a parte do cont porque o código está rodando funcional aqui ele verifica quantos divisores tem se tiver 2 divisores ele joga em primo, estava tentando passar pra MIPS PcSpim.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CHeed       entendi sua lógica  está certa ,  se tiver apenas dois divisores é primo então pega o número , mas nesse caso precisa sair do loop pois já encontrou o número , senão vai pegar o próximo também causando erro ,  então seu código com algumas modificações poderia ser assim    :

Sub Primo()
Dim i As Long
Dim n As Long
Dim j As Long
Dim antes As Long
Dim cont As Long
Dim depois As Long

n = InputBox("Digite um número entre 1 e 50000: ")

If n = 2 Then
   MsgBox ("Não há número primo antes dele.")
   GoTo depois:
   End If
   
If n < 1 Then

MsgBox ("Digite um valor correto.")

n = InputBox("Digite um número entre 1 e 50.000: ")

Else
  If n > 50000 Then
       
    MsgBox ("Digite um valor correto.")

    n = InputBox("Digite um número entre 1 e 50.000: ")
       
  End If
End If
             
For i = n - 1 To 2 Step -1
  cont = 0
  For j = 1 To i
    If i Mod j = 0 Then
      cont = cont + 1
    End If
  Next j
  If cont = 2 Then
    antes = i
    Exit For ' para sair do loop
  End If
Next i
             
MsgBox ("O primo antes do número digitado é: " & antes)
                          
depois:
For i = n + 1 To 50050
  cont = 0 ' conta quantos primos o numero tem
  For j = 1 To i
    If i Mod j = 0 Then
      cont = cont + 1
    End If
  Next
  If cont = 2 Then ' se tiver apenas dois primos
    depois = i
    Exit For ' para sair do loop
  End If
 Next
 MsgBox ("O número primo depois do número digitado é: " & depois)
             
End Sub

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 valeu pelas dicas mano, agora falta só eu conseguir passar pra assembly mesmo kk ^^

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CHeed     tudo bem ,   onde você conseguiu esse MIPS  ?   procurei em vários sites e não o consegui . 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CHeed      obrigado , o link está bom e baixou o pcspim na hora , instalei e está funcionando bem , muito obrigado mesmo .

   no google apareceu muitos sites com o pcspim , mas a maioria deu conexão insegura , e o mozilla bloqueou o site , e os outros que haviam ficam pedindo para instalar outros programas de que eu não preciso e nem quero , sendo assim nenhum deles me serviram  .  mas esse que você passou é dubom mesmo  . obrigado  . . . !

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comecei a passar o código pra assembly ele está mostrando o numero anterior mas o seguinte não e não consigo enxergar onde está o erro se alguém puder ajudar o código esta assim:

 

.data

   msg1: .asciiz"\nDigite um numero entre 1 e 50000: "
   msg2: .asciiz"\nO valor que voce digitou esta incorreto digite novamente."
   msg3: .asciiz"\nNao ha numero primo antes desse valor. "
   msg4: .asciiz"\nO primo anterior foi : "
   msg5: .asciiz"\nO primo posterior foi : "
   
.text

main:
	#mostra(msg1)
	li $v0, 4
	la $a0, msg1
	syscall
   
	#ler(msg1)
	li $v0, 5
	syscall
   
	add $t1, $0, $v0 #t1 é o numero digitado		
   
	#Validação do numero digitado:

	blt $t1, 1, se1
	bgt $t1, 50000, se1
	beq $t1, 2, qfor2

	j comeco
 
se1:
	#mostra(msg2)
	li $v0, 4
	la $a0, msg2
	syscall
   
	j main
   
qfor2:
	#mostra(msg3)
	li $v0, 4
	la $a0, msg3
	syscall
   
	j depois
comeco:
	add $t0, $zero, 2
for1:
	#$t0 = i
	#$t2 = cont
	#$t3 = j
	#$t4 = resto
	add $t2, $zero, 0
	add $t3, $zero, 1
for2:
	rem $t4, $t0, $t3
	beq $t4, 0, contsoma
	possoma:
	add $t3, $t3, 1
ble $t3, $t0, for2
	beq $t2, 2, antes
	dantes:	
	add $t0, $t0, 1 
blt $t0, $t1, for1

	#mostrar o antes
	li $v0, 4
	la $a0, msg4
	syscall
	
	li $v0, 1
	add $a0, $t5, $zero
	syscall
	
	j depois
	
contsoma:

add $t2, $t2, 1
j possoma

antes:
	#$t5 = antes
	add $t5, $t0, $zero 
	j dantes

depois:
	#t0 = x
	#t2 = cont
	#t3 = i
	#t4 = resto
	#t1 = n
	#t5 = j
	#t6 = n - 1
	#t7 = depois
	add $t0, $zero, 1
forx:
	add $t1, $t1, 1
	sub $t6, $t1, 1
	move $t3, $t6
fori:
	add $t2, $zero, 0
	add $t5, $zero, 1
forj:
	rem $t4, $t3, $t5
	beq $t4, 0, somacont2
	possoma2:
blt $t5, $t3, forj
	beq $t2, 2, ndepois
	posdepois:
blt $t0, $t6, fori
blt $t0, $t1, forx

	#mostrar primo depois
	li $v0, 4
	la $a0, msg5
	syscall
	
	li $v0, 1
	move $a0, $t7
	syscall
	
	j fim
somacont2:
	add $t2, $t2, 1
	j possoma2
	
ndepois:
	add $t7, $t3, $zero
	move $t0, $t1
	j posdepois

fim:

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!