Ir ao conteúdo
  • Cadastre-se

Ajuda em Ordenação de Vetores


msj238120s

Posts recomendados

Fala galera,sou iniciante na programação em C,  vou dar uma explanada na questão e se alguém puder me ajudar ficarei muito grato, eu já fiz de tudo nesse problema e não consigo resolver.

O código no estágio atual:
http://pastebin.com/GUY2HtZw

Basicamente o  problema pede para ordenar um vetor de acordo com o MDC dos termos desse vetor com um determinado numero, e há duas condições de desempate caso necessário.
 

As entradas são: Tamanho do vetor e o numero M que será usado de padrão para comparação do MDC,Ele compara o MDC dois a dois com o valor M e coloca-os em ordem decrescente. (Primeiro termo maior MDC).

Exemplo:

(números em negritos são a saída do programa)

10 5 

1

2

3

4

5

6

7

8

9

10

 

10 5 1 2 3 4 6 7 8 9

 

 

Condição de desempate 1: O menor numero invertido deve vir antes, caso não for satisfeita:
Condição de desempate 2: O menor numero deve vir antes.

Agradeço desde já quem tiver um tempo pra me ajudar, valeu
 

Link para o comentário
Compartilhar em outros sites

Olá oliver, o tipo de ordenação por MDC não parece ser um algoritmo conhecido, ao menos eu pesquisei e não achei, não sei se deu uma olhada no código, mas eu fiz as funções todas e as condições mas o resultado não está dando certo, se puder ajudar, valeu

Link para o comentário
Compartilhar em outros sites

O que você está tentando fazer nessa linha?

MX = mdc_comparaX(M, vetor);
O segundo parâmetro dessa função é do tipo int e você está passando um vetor.

Você pode colocar a descrição do problema?

E tem umas estruturas condicionais com MX e MY que atribuiem as variáveis x e y ao vetor, mas essas variáveis não são usadas em nenhum lugar. Foram apenas declaradas no início do programa.

Link para o comentário
Compartilhar em outros sites

O que você está tentando fazer nessa linha?

 

MX = mdc_comparaX(M, vetor);
O segundo parâmetro dessa função é do tipo int e você está passando um vetor.

Você pode colocar a descrição do problema?

E tem umas estruturas condicionais com MX e MY que atribuiem as variáveis x e y ao vetor, mas essas variáveis não são usadas em nenhum lugar. Foram apenas declaradas no início do programa.

 

 

Eu mudei agora para, está correto?

MX = mdc_comparaX(M, vetor);

MY = mdc_comparaY(M, vetor[i+1]);

Descrição do problema:

Entradas: n, M, elementos do vetor

1- Seja A e B dois elementos de um vetor, A deve anteceder B somente se o MDC de A com M for maior que o MDC de B com M.

Caso o MDC de a com M e de b com M for igual:

2-  A lido da direita para esquerda for menor do que B lido da direita para esquerda, ou seja, o número formado pelos dígitos de A invertidos deve ser menor que o número formado pelos dígitos de B invertidos.

Caso os inversos forem iguais:

3 - O menor elemento deve anteceder o maior
Link para o comentário
Compartilhar em outros sites

Usei bubble sort para ordenar, veja se é assim.

Só fiz um teste com os valores de 1 a 10.

#include <stdio.h>int mdc(int, int);int inverte(int);void troca(int *, int *);void ordena(int *, int, int);int main(){    int i, m, n;        scanf("%d %d%*c", &n, &m);    int vetor[n];    for(i = 0; i < n; i++){        scanf("%d%*c", &vetor[i]);    }        ordena(vetor, m, n);    printf("\n\n");    for(i = 0; i < n; i++){        printf(" %d", vetor[i]);    }        printf("\n");    return 0;}void ordena(int *v, int m, int n){    int i, continua = 1;    while(continua){        continua = 0;        for(i = 0; i < n - 1; i++){                        if(mdc(v[i], m) == mdc(v[i + 1], m)){                if(inverte(v[i]) > inverte(v[i + 1])){                    troca(&v[i], &v[i + 1]);                                 continua = 1;                }else if(inverte(v[i] == v[i + 1])){                    if(v[i] > v[i + 1]){                        troca(&v[i], &v[i + 1]);                        continua = 1;                    }                }            }else if(mdc(v[i], m) < mdc(v[i + 1], m)){                                troca(&v[i], &v[i + 1]);                continua = 1;            }             }    }}void troca(int *a, int *{    int aux = *a;    *a = *b;    *b = aux;}int inverte(int a){    int x = 0;    while(a){        if(x) x *= 10;        x += a % 10;                a /= 10;    }    return x;}int mdc(int a, int {    int aux;    while({        aux = b;        b = a % b;        a = aux;    }    return a;}
Link para o comentário
Compartilhar em outros sites

Bacana.

 

 

Tinha feito e estava fazendo uns testes :). Basicamente a mesma solução do @olliver.soul. Usei um bubble sort e criei funções ao estilo strcmp() para que eu pudesse saber a relação entre os termos e dar uma clareada no código. No mais, é a mesma coisa.

 

 

Fiz alguns testes e os resultados batem com ambos os códigos.

 

 

[ ]'s


Ops...

 

Vetor de entrada: {3,3,3,3,93,300,82,43,100,30}

 

 

Saídas:

 

Minha:

100 30 300 3 3 3 3 82 43 93

 

 

@olliver.soul

100 300 30 3 3 3 3 82 43 93

 

 

Que resultado deu aí, @haoz11?

 

 

 

[ ]'s

Link para o comentário
Compartilhar em outros sites

@olliver.soul

 

Usei o bubble sort estritamente:

void ordmdc(int *arr, int k, int m){    int i, j, mdcdif, swpdiff;    for (i = 0; i < k - 1; i++)        for (j = i + 1; j < k; j++)        {            mdcdif = mdccmp(arr[i], arr[j], m);            if (mdcdif > 0)            {                swap(&arr[i], &arr[j]);            }            else if (mdcdif == 0)            {                swpdiff = swpcmp(arr[i], arr[j]);                if (swpdiff > 0)                {                    swap(&arr[i], &arr[j]);                }                else if (swpdiff == 0)                    if (arr[i] > arr[j])                    {                        swap(&arr[i], &arr[j]);                    }            }        }}

O resto é o lance das funções que tinha falado. O bom é quando se tem uma bateria de dados de entrada para testar a fundo.

 

 

 

[ ]'s

Link para o comentário
Compartilhar em outros sites

Fiz uma pequena alteração no meu código para a saída ficar igual.

O problema era no else/if da igualdade dos inversos.

Função corrigida:

void ordena(int *v, int m, int n){    int i, continua = 1;    while(continua){        continua = 0;        for(i = 0; i < n - 1; i++){            if(mdc(v[i], m) == mdc(v[i + 1], m)){                if(inverte(v[i]) > inverte(v[i + 1])){                    troca(&v[i], &v[i + 1]);                                 continua = 1;                }else if(inverte(v[i]) == inverte(v[i + 1])){                    if(v[i] > v[i + 1]){                        troca(&v[i], &v[i + 1]);                        continua = 1;                    }                }            }else if(mdc(v[i], m) < mdc(v[i + 1], m)){                                troca(&v[i], &v[i + 1]);                continua = 1;            }             }    }}
Link para o comentário
Compartilhar em outros sites

  • 4 meses depois...

Esse é a ordenação bubble sort, acredito que é o de mais fácil compreensão.

 

#include <stdio.h>
#include <stdlib.h>
 
int main( )
{
int v[10], i, j, aux;
    for (i=0 ; i<=9 ; i++)
  {
   printf("Informe um numero:");
   scanf("%d", &v);
}
for (i=0;i<9;i++)
   for (j=0;j<9;j++)
   if (v[j]>v[j+1])
{
   aux=v[j];
   v[j]=v[j+1];
   v[j+1]=aux;
}      
for (i=0 ; i<10 ; i++)
   printf("%d\n", v);    
printf("\n\n");
system("pause");  
}   
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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...