Moranguito Posted November 9, 2008 Share Posted November 9, 2008 (edited) Bem , estou completamente encravado num programa em C :dumb: , O programa reza assim Para um dado número inteiro positivo, o programa deve apresentar as somas de 3 parcelas diferentes cujo total é esse número, e descartar as repetições. Ex. Número introduzido: 21 Resultado: 1+2+18 1+3+17 1+4+16 Deve descartar por exemplo 1+18+2 pk é igual a 1+2+18. Eu não sei se bem, mas estou a fazer assim (ainda não compilei ptt nem sei se isto vai dar algo de jeito) int a=1, b=2, c, d; c= n-3 d = a + b + c if (d==n) printf ("%d + %d + %d\n", a, b, c); c--; else b++; n é o número introduzido para se calcular as somas Agora eu acho que isto não tá nada bem, alguém me pode dar umas luzes sobre se estou a ir no bom caminho ou se devo apagar isto e começar de novo (qual o caminho correcto a seguir?) E não tou nada a ver como dizer ao programa para entre "1+2+18" e "1+18+2" e "18+1+2" e "18+2+1" escolher só uma para output visto serem todas "iguais". Any help please? :shy: Edited November 9, 2008 by Moranguito Link to comment Share on other sites More sharing options...
KilL_MaSTeR Posted November 9, 2008 Share Posted November 9, 2008 (edited) #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ int num = atoi(argv[1]); int a = 1,b=2,c=num - 3,res = a + b + c; while(res==num && c > 0 && c >= b){ printf("%d + %d + %d\n",a,b,c); c--; b++; } return -1; }EDIT: Toma lá ^^ Edited November 9, 2008 by KilL_MaSTeR Link to comment Share on other sites More sharing options...
dark_shadow_rules Posted November 9, 2008 Share Posted November 9, 2008 (edited) #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ int num = atoi(argv[1]); int a = 1,b=2,c=num - 3,res = a + b + c; while(res==num && c > 0 && c >= b){ printf("%d + %d + %d\n",a,b,c); c--; b++; } return -1; }EDIT: Toma lá ^^Penso que o valor "a" também é suposto mudar, ou não?E não tou nada a ver como dizer ao programa para entre "1+2+18" e "1+18+2" e "18+1+2" e "18+2+1" escolher só uma para output visto serem todas "iguais".Any help please? :shy:Até tenho uma solução para isso mas gasta mais memória porque guarda todos os resultados que já saíram, é uma solução um bocado dumb Edited November 9, 2008 by dark_shadow_rules Link to comment Share on other sites More sharing options...
PJP Posted November 9, 2008 Share Posted November 9, 2008 (edited) 1º - Precisas de usares ciclos (for /while /..) para gerares todas as combinações. 2º - É relativamente fácil evitares repetições, este é um algoritmo básico (deixo para ti usares a linguagem que quiseres):for (a = 1; a < n / 2; a++) { b = a; c = n - a - b; while (c >= b ) { write (a b c); b++; c--; } }Isto gera:1+1+19 (n sei se pode ter repetidos)1+2+181+3+171+4+161+5+151+6+141+7+131+8+121+9+111+10+102+2+172+3+162+4+152+5+142+6+132+7+122+8+112+9+103+3+15...Normalmente neste tipo de algoritmos deves procurar entender a sua lógica, vais ver que é aí que está o segredo ;)PS: Alterado para poupar uma variável :P e ficar mais bonito Edited November 9, 2008 by PJP Link to comment Share on other sites More sharing options...
Moranguito Posted November 9, 2008 Author Share Posted November 9, 2008 Bem desde já obrigado pelas respostas, @Kill_Master Bem alterei um pouquito o teu programa, porque tens aí coisas que eu ainda não aprendi :shy: e ficou assim: int main(){ int a, b, c, res, num; printf("Escreva um numero?"); scanf("%d",&num); a = 1; b = 2; c = num - 3; res = a + b + c; while(res==num && c > b){ printf("%d + %d + %d\n",a,b,c,); c--; b++; } system ("pause"); return 0; } Comecei por tirar o "&& c>0" porque eu quero colocar uma mensagem caso não seja possível construir somas com o número dado como por exemplo "2,3,4,5" (pois as 3 parcelas têm de ser diferentes), e tirei o "=" de "c>=b", exactamente pelo mesmo motivo do anterior, por exemplo com o número 21 ia dar-me a soma "1+10+10". Isto funciona muito bem, eu estava quase lá , agora só falta mesmo mudar isto de forma a que a também mude o a por exemplo: Com o número 21 dá-me as seguintes somas: 1+2+18 1+3+17 1+4+16 1+5+15 1+6+14 1+7+13 1+8+12 1+9+11 faltam as somas: 2+3+16 2+4+15 2+5+14 .... 3+4+14 3+5+13 ... @PJP Usei o teu algoritmo para chegar à minha solução: #include <stdio.h> #include <stdlib.h> int main() { int a, b, n, c; printf("Escreva um numero?"); scanf("%d",&n); for (a = 1; a < n / 2;) { b = a + 1; c = n - a - b; while (c > b ) { printf("%d + %d + %d\n",a,b,c); b++; c--; } for (a = 2; a < n / 2; a++) { b = a + 1; c = n - a - b; while (c > b ) { printf("%d + %d + %d\n",a,b,c); b++; c--; } } system ("pause"); return 0; } } Só que fiquei sem perceber uma coisa, antes de colocar o segundo "for" ele apenas me mostrava as somas para quando "a=1" e nunca ia incrementar "a", com o segundo for ele dá-me todas as somas, mas se tirar o "a++" ele entra num loop sem fim, com o "a++" no primeiro for ou sem o "a++" o resultado está sempre correcto. Não percebi porquê :dumb: Link to comment Share on other sites More sharing options...
{zzz} Posted November 9, 2008 Share Posted November 9, 2008 dois "for"s e resolves isso :P Link to comment Share on other sites More sharing options...
Moranguito Posted November 9, 2008 Author Share Posted November 9, 2008 dois "for"s e resolves isso :PPois isso já eu percebi, só não percebi porque é que só funciona com o 2º for, e porque tirando o "a++" do segundo for aquilo fica ad eternum a passar números no ecran!É que convém que eu perceba o porquê da solução se não, não me vale de nada não é?:P Link to comment Share on other sites More sharing options...
PJP Posted November 10, 2008 Share Posted November 10, 2008 (edited) Desculpa mas não percebi o que fizeste ao meu algoritmo. Já percebi que não querias números repetidos mas para que é que tens os dois For??#include <stdio.h> #include <stdlib.h> int main() { int a, b, n, c; printf("Escreva um numero?"); scanf("%d",&n); for (a = 1; a < n / 2; a++) { b = a + 1; c = n - a - b; while (c > b ) { printf("%d + %d + %d\n",a,b,c); b++; c--; } } system ("pause"); return 0; }Tens a certeza que isto assim não chega? Ele só fazia o 'a' igual a 1 porque não tem o "a++" dentro do "for (a = 1; a < n / 2; a++)"É óbvio que se tirares o a++ ele vai entrar em ciclo infinito. Imagino que já tenhas aprendido como funciona a instrução for mas cá vai:- O for é constituido por três partes: 1ª - Inicialização de valores nas variáveis;2ª - Condição de terminação. Podes lêr da seguinte forma - "Enquanto a for menor que N /2 executa instruções dentro do for"3ª - Instruções de fim de ciclo. Neste caso, no final do ciclo incrementa 'a' de uma unidade. Não tendo mais nenhum sítio onde incrementas o 'a', a 2ª parte do for: "Enquanto a for menor que N /2 executa instruções dentro do for" vai retornar sempre verdadeiro e daí nunca sair do ciclo.Imagino que estejas no início, vais ver que daqui a algum tempo estes conceitos vão ser básicos. Edited November 10, 2008 by PJP Link to comment Share on other sites More sharing options...
Moranguito Posted November 10, 2008 Author Share Posted November 10, 2008 Tens a certeza que isto assim não chega? Ele só fazia o 'a' igual a 1 porque não tem o "a++" dentro do "for (a = 1; a < n / 2; a++)" É óbvio que se tirares o a++ ele vai entrar em ciclo infinito. Imagino que já tenhas aprendido como funciona a instrução for mas cá vai: - O for é constituido por três partes: 1ª - Inicialização de valores nas variáveis; 2ª - Condição de terminação. Podes lêr da seguinte forma - "Enquanto a for menor que N /2 executa instruções dentro do for" 3ª - Instruções de fim de ciclo. Neste caso, no final do ciclo incrementa 'a' de uma unidade. Não tendo mais nenhum sítio onde incrementas o 'a', a 2ª parte do for: "Enquanto a for menor que N /2 executa instruções dentro do for" vai retornar sempre verdadeiro e daí nunca sair do ciclo. Imagino que estejas no início, vais ver que daqui a algum tempo estes conceitos vão ser básicos. Eu peguei no teu algoritmo, e sem alterar nada, ele só me dava a lista das somas para a=1, mesmo com o a++ no for, quando coloquei o segundo for é que o programa me começou a dar o resultado que queria, mas amanhã vou dar uma nova vista de olhos, agora é caminha que amanhã trabalha-se :P Thank's pelas ajudas e explicações , eu ainda estou no início :shy: @PJP Jovem, como te disse fui experimentar o programa de novo e não é que funciona só com um for, não sei o que se passou mas ontem em casa eu juro que quando corri o programa para o número 21, só com o primeiro for ele só me dava as somas: 1+2+18 1+3+17 1+4+16 1+5+15 1+6+14 1+7+13 1+8+12 1+9+11 :shy: Muito obrigado pela ajuda e pela explicação. Peço há equipa moderativa para manter este tópico aberto porque quando tiver mais dúvidas escuso de estar a abrir mais tópicos :P Link to comment Share on other sites More sharing options...
Moranguito Posted December 10, 2008 Author Share Posted December 10, 2008 Bem cá volto eu com outro problema, tenho estado a estudar a parte de strings e vectores, no livro que uso (Fundamentos de Programação em C) o 1º exercício reza assim:Pretende-se codificar a informação contida num vector de inteiros da seguinte forma: sempre que um número x é repetido n vezes, a sequência de repetições é substituída por nx. Por exemplo é introduzido o número 277733444 que deve ser substituído por 12372334. Escreva uma rotina que faça também a descodificação.Ora eu mentalmente já consegui ver o que se pretende, se não estou errado consoante se escolha codificar ou descodificar, ele deve ler número a número e fazer o que se pretende. Isto é tudo muito bonito na cabeça, mas num programa em C a coisa pia mais fino :P.E como o livro não têm os exercícios propostos resolvidos eu estou um pouco encravado, alguém consegue ajudar a que se faça luz nesta cabecita :PThank's@PJP depois de muito bater com a córnea na parede, o meu segundo for não estava lá a fazer nada, eu é que quando comecei a trabalhar o teu algoritmo, fazendo alterações para ver o que acontecia quando mexia aqui e ali, coloquei uma chaveta fora do sítio, e por isso o programa só me dava o resultado que eu pretendia com um segundo for. Mas é assim que se aprende :P Link to comment Share on other sites More sharing options...
camurso_ Posted December 10, 2008 Share Posted December 10, 2008 Bem cá volto eu com outro problema, tenho estado a estudar a parte de strings e vectores, no livro que uso (Fundamentos de Programação em C) o 1º exercício reza assim:Pretende-se codificar a informação contida num vector de inteiros da seguinte forma: sempre que um número x é repetido n vezes, a sequência de repetições é substituída por nx. Por exemplo é introduzido o número 277733444 que deve ser substituído por 12372334. Escreva uma rotina que faça também a descodificação.Ora eu mentalmente já consegui ver o que se pretende, se não estou errado consoante se escolha codificar ou descodificar, ele deve ler número a número e fazer o que se pretende. Isto é tudo muito bonito na cabeça, mas num programa em C a coisa pia mais fino :P.E como o livro não têm os exercícios propostos resolvidos eu estou um pouco encravado, alguém consegue ajudar a que se faça luz nesta cabecita :PThank's@PJP depois de muito bater com a córnea na parede, o meu segundo for não estava lá a fazer nada, eu é que quando comecei a trabalhar o teu algoritmo, fazendo alterações para ver o que acontecia quando mexia aqui e ali, coloquei uma chaveta fora do sítio, e por isso o programa só me dava o resultado que eu pretendia com um segundo for. Mas é assim que se aprende :PSegundo o que li, tens que "traduzir" o que te vou dizer para C.Crias um vector chamado final, por exemplo.Crias um contador.Percorres o vector que te dão e guardas o valor do índice actual e o do índice seguinte (se ainda não chegaste ao final do vector).Enquanto o seguinte == actual -> incrementas o contador e os índices.Quando saíres do while ainda estás dentro do for que percorre o índice.Colocas no vector final o valor de actual e o valor do contador.É mais ou menos isto, feito de cabeça. O mais difícil é a "tradução", mas o algorítmo é, mais ou menos, este. ;) Link to comment Share on other sites More sharing options...
Moranguito Posted December 11, 2008 Author Share Posted December 11, 2008 Estou com a cabeça a deitar fumo....Antes de mais com o faço que ele leia o vector 22233344 como 8 caracteres distintos ele só lê se for introduzido 2 2 2 3 3 3 4 4.Para ver se dava algo de jeito comecei por fazer este pedaço de código, mas ele dá-me sempre i como 0:i=0; vini=v[0]; vseg=v[1]; while (vini == vseg) { i++; vseg++; }:dumb: Link to comment Share on other sites More sharing options...
Anusko Posted December 11, 2008 Share Posted December 11, 2008 #include <stdio.h> #include <string.h> int main () { char str1[100], str2[100], last, temp[10]; int n, i, cnt; scanf("%d", &n); sprintf(str1, "%d", n); last = str1[0]; for(cnt = 1, i = 1; str1[i] != '\0'; i++) { if(str1[i] == last) { cnt++; } else { sprintf(temp, "%d%c", cnt, last); strcat(str2, temp); last = str1[i]; cnt = 1; } } sprintf(temp, "%d%c", cnt, last); strcat(str2, temp); printf("output: %s\n", str2); return 0; }Não está bonito mas funciona. Link to comment Share on other sites More sharing options...
Moranguito Posted December 14, 2008 Author Share Posted December 14, 2008 #include <stdio.h> #include <string.h> int main () { char str1[100], str2[100], last, temp[10]; int n, i, cnt; scanf("%d", &n); sprintf(str1, "%d", n); last = str1[0]; for(cnt = 1, i = 1; str1[i] != '\0'; i++) { if(str1[i] == last) { cnt++; } else { sprintf(temp, "%d%c", cnt, last); strcat(str2, temp); last = str1[i]; cnt = 1; } } sprintf(temp, "%d%c", cnt, last); strcat(str2, temp); printf("output: %s\n", str2); return 0; }Não está bonito mas funciona.Boas, se colocar um inteiro superior a 9 "casas" ele retorna um valor estranhissimo.E descodificar? Alguém com alguma ajudita :P? Link to comment Share on other sites More sharing options...
Donovan Posted December 14, 2008 Share Posted December 14, 2008 Descodificar é o mesmo processo. Tendo em conta que o número ímpar é o nº de vezes que o número par se repete, então:char res[200]; char str1[100]; scanf("%d", &n); sprintf(str1, "%d", n); int numVezes; int numAnalisado; int i, y; for (i = 0; str1[i] != '\0'; i++) { if(i%2) numVezes = strt1[i]; else { numAnalisado = str1[i]; for(y = 0; y < numVezes; y++) { res = res + numAnalisado } } }Algo assim :-.. Link to comment Share on other sites More sharing options...
Anusko Posted December 14, 2008 Share Posted December 14, 2008 #include <stdio.h> #include <string.h> int main () { char str1[100], str2[100], last, temp[10]; int i, cnt; scanf("%s", &str1); last = str1[0]; for(cnt = 1, i = 1; str1[i] != '\0'; i++) { if(str1[i] == last) { cnt++; } else { sprintf(temp, "%d%c", cnt, last); strcat(str2, temp); last = str1[i]; cnt = 1; } } sprintf(temp, "%d%c", cnt, last); strcat(str2, temp); printf("output: %s\n", str2); return 0; }Epá deves estar a usar uma máquina onde um inteiro são 32bits e estás a inserir um valor superior a 2^32. Tb estava a ser "parvo", pode-se logo sacar o número em forma de array de caracteres. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now