Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

RafaelCLP

Membros Plenos
  • Total de itens

    366
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

96

1 Seguidor

Sobre RafaelCLP

Informações gerais

  • Cidade e Estado
    Rio de Janeiro/RJ
  • Sexo
    Masculino

Meu Notebook

  • Marca
    Avell
  • Modelo
    Titanium B155 Max SE
  • Tamanho da tela
    15.6"
  • Processador
    Intel Core i7-4710MQ
  • Chip gráfico
    GTX 850M 2GB DDR3
  • Memória
    HyperX Impact DDR3-1600 4 GB (x2)
  • HD
    HGST Travelstar 7K1000 7200RPM - 1TB
  • SSD
    Samsung 850 EVO - 500GB
  • Sistema Operacional
    Windows 10

Meu Smartphone

  • Marca e modelo
    Samsung Galaxy S6
  1. C++ Criptografia Simétrica em C++ (Utilização de chave)

    Vou copiar a parte importante do código que você postou acima aqui só pra não ter que ficar baixando o arquivo: string symmetricCrypt(string str, string chave){ unsigned long valor = 0, chave_int = 0; string strC = ""; for(int aux = 0; aux < str.length(); ){ for(int i = 0; i < chave.length(); i++){ chave_int = chave[i]; valor = str[aux] * chave_int; strC += (unsigned char) valor; aux++; } } return strC; } string symmetricDecrypt(string str, string chave){ unsigned long valor = 0, pos_chave = 0; string strDec = ""; for(int i = 0; i < str.length(); i++){ valor = str[i]; valor /= chave[pos_chave]; strDec += (char) valor; if(pos_chave == (chave.length() - 1)){ pos_chave=0; }else{ pos_chave++; } } return strDec; } Eu sei qual o problema, mas não sei como explicar de uma forma fácil de entender =/. Primeira coisa que você deve corrigir é no Crypt. Se str.length() não for um múltiplo de chave.length() dá problema, porque você continua aumentando o aux e acessando str[aux] mesmo após acabar a string. Agora, vamos ao real problema de sua criptografia Tanto str[aux] quando chave[ i ] podem ter um valor de 0 a 255 (ou -128 a 127), assumindo que pode receber um binário pra ser criptografado. Isso significa que str[aux] * chave[ i ] dão um valor de até 255². Só que em seguida você concatena o resultado convertido para unsigned char em uma string. Como unsigned char só vai de 0 a 255, o que você está fazendo é idêntico a: strC += (unsigned char) (valor % 256); // o resto da divisão de valor por 256 O que isso significa é que strC[ i ] é o equivalente a: strC[i] = (unsigned char) (((unsigned int) str[i] * chave[i % chave.length()]) % 256); Que pode ser simplificado para: strC[i] = str[i] * chave[i % chave.length()]; Note que o % 256 é aplicado implicitamente por causa do overflow. Para prosseguir, vamos escrever isso da seguinte forma: SCi = Si * Ci (mod 256), onde SCi = strC[i], Si = str[i] e Ci = chave[i % chave.length()] Agora vem a sua descriptografia. strD[i] = strC[i] / chave[i % chave.length()] % 256 // esse % 256 está implicito no cast: (char) Vou deixar sua equação no mesmo formato da de cima: SDi = SCi / Ci (mod 256), onde SDi = strD[i], SCi = strC[i] e Ci = chave[i % chave.length()] Por que isso não funciona? Esta é a parte difícil de te explicar. Você precisaria de estudar teoria dos números para entender. Mas vou tentar ao menos te mostrar que não funciona. Vamos dizer que Si = 65 ('A') e Ci = 66 ('B'). Pela fórmula da criptografia, temos: SCi = Si * Ci (mod 256) SCi = 65 * 66 (mod 256) SCi = 4290 (mod 256) SCi = 194 Agora vamos descriptografar: SDi = SCi / Ci (mod 256) SDi = 194 / 66 (mod 256) SDi = 2 (mod 256) SDi = 2 Bem diferente do original 65. Isso acontece por causa do mod. Você não pode realizar divisões quando há mod envolvido. Multiplicações funcionam, divisões não!! O que você pode fazer? Em vez de dividir por 66 (mod 256), pode multiplicar por 66^-1 (mod 256). Mas lembre-se que 66^-1 = 1/66, e você não pode dividir, então precisa de outra forma de calcular o valor de 66^-1 (mod 256). Para calcular o inverso modular (b^-1 mod M), veja: http://mathworld.wolfram.com/ModularInverse.html O problema é que para um número N (mod M) ter inverso modular, N e M devem ser coprimos (não devem ter nenhum fator primo em comum). Não é o caso aqui (66 e 256, por exemplo, têm o 2 como fator em comum). Logo, sua descriptografia jamais poderia funcionar se Ci for par. Você pode tentar chutar um valor pra SDi e ver se ao criptografá-lo dá SCi. Em outras palavras, testar todos os possíveis valores de SDi e achar aqueles que, ao criptografar, resultam em SCi. Só que vários caracteres distintos em Si podem resultar no mesmo SCi. Por exemplo, no caso acima em que Ci = 66, tanto Si = 65 quanto Si = 193 resultariam no mesmo SCi = 194. Como saber qual dos dois é o correto? Não dá... Em resumo, sua criptografia não funciona. Ela não pode ser descriptografada. O que fazer para resolver o problema? Em vez de jogar essa criptografia fora e fazer outra, você pode simplesmente alterar o valor de Ci tal que seja possível calcular o inverso modular. O usuário digita a chave, mas em vez de você usar Ci, você usa 2*Ci + 1. Isso resulta num número ímpar, que sempre é coprimo de 256 (2^8), e portanto o inverso modular existe. A existência do inverso modular implica que pra todo par (SCi, 2*Ci + 1), só existe um Si que poderia ter produzido tal SCi. Para calcular o inverso modular (lembre-se: você não poderá realizar a divisão, terá que substituí-la por uma multiplicação) veja o link que te mandei ou pesquise vídeos a respeito. adicionado 23 minutos depois Pra facilitar tua vida, aqui está um jeito bem simples de encontrar o inverso modular que eu considero fácil de entender: int invmod(int b, int m) { int bb = b; while (bb > 0 && (bb * b) % m != 1) bb = (bb * b) % m; return bb; } Repare que eu paro quando ( bb * b ) % m dá 1 e retorno bb. Por que? Existe um ciclo aí. Depois que multiplicarmos bb por b uma certa quantidade de vezes, ele vai voltar para seu valor inicial. Afinal, se eu sempre aplico % m, apenas m valores distintos podem ser obtidos, e uma hora vão ter que começar a se repetir. Note que b^0 % m = 1. Logo, se b^e % m = 1, o ciclo resetou (b^e seria equivalente a b^0), então b^(e-1) % m = (b^0 * b^-1) % m = 1 * b^-1 % m = b^-1 % m. Exatamente o que queremos! Esse código é pouco eficiente, O(m), então eu recomendo usar o algoritmo de euclides e usar o código acima só pra entender a ideia.
  2. Tranquilo! Agora o que eu te recomendo é decidir quanto quer gastar, ou então decidir que jogos vai querer rodar pra gente te ajudar a descobrir quanto precisa gastar (pra rodar só crossfire não precisa de muita coisa). Claro que você pode decidir usar logo os 5000 reais todos e comprar o melhor que puder com isso, mas talvez não haja necessidade. Pelo que entendi, você só veio atrás de algumas peças pro PC do seu irmão pra rodar Crossfire a 100fps+, e pretende comprar seu próprio PC ano que vem. Se puder esclarecer qual a situação exatamente já ajudaria a gente a decidir o que você precisa. Tem algo mais além de crossfire que você costuma jogar (ou jogaria se o computador aguentasse)? GTA V, The Witcher 3, CS GO, ...?
  3. Monitores "comuns" são 60 Hz. É possível mas pouco provável você ter comprado um monitor de mais de 60 Hz sem saber. Se quiser ter certeza, pesquise pelo modelo do seu monitor na internet e veja nas especificações técnicas. Monitores de 60 Hz são o padrão. Monitores acima disso (120 Hz, 144 Hz, 160 Hz, e mais recentemente, acima de 200 Hz) são muito mais caros do que os de 60 Hz, então só se investe em um quando há benefício significativo (ou quando você tem muito dinheiro e quer comprar o melhor ). O benefício maior se vê principalmente em jogos de FPS (First Person Shooter), como é o caso de Crossfire, mas a diferença é notável em grande parte dos jogos. Dá pra notar a diferença de 120 pra 144, mas é bem menos significativa do que de 60 pra 120. Então se achar um de 120 Hz por um preço mais baixo do que um de 144 Hz, vale muito a pena considerar o de 120. Recomendo pesquisar no youtube comparações: 60 hz vs 120 hz vs 144 hz e assistir. É o jeito mais fácil de entender. Eu gosto deste vídeo: Ele mostra a diferença de 15 pra 30 pra 60. Não mostra pra 120, mas você também não conseguiria ver (porque seu monitor é de 60 Hz, então mesmo que ele mostre um vídeo de 120 fps, seu monitor continuaria só exibindo metade disso e você só veria como se fosse 60 - espero que esteja claro).
  4. O PCIe x16 é só uma entrada na placa-mãe: É lá que encaixa a placa de vídeo. A sua tem um, então não precisa se preocupar. De maneira simplificada, esse 144 hz no monitor é a quantidade de vezes (por segundo) que o monitor consegue atualizar a imagem exibida nele. Se o monitor tem 60 Hz, significa que ele mostra 60 quadros por segundo. Se você está conseguindo 100 fps no jogo, está conseguindo produzir 100 imagens por segundo, que podem ser exibidas no monitor, mas se o monitor é de 60 Hz apenas 60 são mostradas e as outras descartadas (porque o monitor não consegue atualizar rápido o suficiente o que está sendo exibido). Um monitor de 144 Hz consegue atualizar a imagem 144 vezes por segundo, então consegue mostrar até 144 fps.
  5. @Kimo Gordinho A GT 1030 é placa de vídeo mesmo, devo ter me expressado mal . Ela aguenta crossfire a várias centenas de fps. Agora precisa ver se o processador também aguenta. De maneira simplificada, o FPS acaba sendo o mínimo entre o que a placa de vídeo consegue produzir e o que o processador consegue produzir. Se a placa de vídeo é boa o suficiente pra 500 fps nesse jogo, mas o processador só vai a 30 fps, vai ficar só 30 fps. O que produz menos FPS acaba limitando o desempenho do outro (isso é o que chamamos de gargalo).
  6. Só pra te dar uma ideia do que o pessoal está perguntando e por quê. Querem saber qual a fonte porque a placa de vídeo consome energia, então é necessário ver se sua fonte consegue entregar a quantidade de energia necessária. Quanto ao gabinete, se for muito pequeno a placa de vídeo pode não caber, por isso também é bom saber; geralmente não dá problema, mas pra ter 100% de certeza é bom você dizer o modelo OU - se souber o que está fazendo - medir o espaço com uma régua. A placa-mãe você só disse a marca, só que qualquer marca existem centenas de modelos diferentes, alguns bem simples e de baixo custo, e outros bem mais caros e com mais recursos. Geralmente a única coisa que precisa ver pra saber se é compatível com a placa de vídeo é se ela tem um slot PCIe x16, pois de resto é muito raro ter problema de compatibilidade. Como você já está usando uma placa de vídeo, assumo que tenha. A influência da placa-mãe no desempenho é irrelevante. O que influencia é o processador, placa de vídeo e memória ram. A placa-mãe vem com um "espaço" pra você encaixar o processador. O problema é que não é qualquer processador que encaixa em qualquer placa-mãe. O encaixe (que nós chamamos de socket) precisa ser igual; em outras palavras, você tem que pegar um processador e uma placa-mãe que tenham o mesmo encaixe (socket). Quando a Intel lança novos processadores, quase sempre ela lança eles com um socket diferente da geração anterior. Então se você troca de processador, é normal ter que trocar também de placa-mãe (já que o novo processador não encaixa na placa antiga), mesmo que ela por si só seja irrelevante pro desempenho. Além disso, de alguns anos pra cá as memórias DDR3 foram substituídas pelas DDR4, então as novas placas-mãe (compatíveis com os novos processadores) usam DDR4. Você só tem memória DDR3, que não é compatível com elas, tendo também que comprar novas memórias. De volta ao tópico A GT 1030 está em promoção por R$ 280 + frete. O preço está excelente. É a placa de entrada da geração atual da Nvidia e aguenta Crossfire tranquilamente, com centenas de fps. O problema agora é o processador. Não sei se ele segura o jogo a 100 fps. O único jeito de garantir é você testar e nos dizer. Você veio aqui com o objetivo de comprar o suficiente pra rodar crossfire a 100 fps cravado. Com pouco dinheiro você consegue isso (até mais do que isso). Mas você tem 5000 reais, que dá pra comprar um excelente computador gamer. A questão é: você só quer gastar o mínimo possível pra rodar crossfire a algumas centenas de fps, ou quer usar todo esse dinheiro em um computador muito melhor?
  7. Firebird Select de todos os autores de um livro quando um autor X está entre eles

    O resto dos campos não importa muito mesmo, eu queria só confirmar. Acho que entendi o que você quer. Dado o nome de um autor, encontrar todos os pares (titulo, autor) para todos os livros que têm o nome dado como um dos autores. Nunca mexi com Firebird e não estou a fim de baixar o software pra poder testar a query, então posso ter errado na sintaxe ou ter feito algo não permitido na linguagem. SELECT li.titulo, au.nome FROM Intermediaria AS auli JOIN Autor AS au ON (au.id_autor = auli.id_autor) JOIN Livro AS li ON (li.id_livro = auli.id_livro) WHERE auli.id_livro IN ( SELECT DISTINCT id_livro FROM Intermediaria WHERE id_autor IN ( SELECT id_autor FROM Autor WHERE nome='João da Silva Pereira' ) ) Explicando a solução (assumindo que funciona) Primeiro, seleciono os ids dos autores que têm o nome recebido (assumindo que pode ter vários autores com mesmo nome, se não puder funciona também obviamente)... SELECT id_autor FROM Autor WHERE nome='João da Silva Pereira' Depois, seleciono os ids dos livros que têm como autor algum dos ids retornados pela query acima: SELECT DISTINCT id_livro FROM Intermediaria WHERE id_autor IN ( ... ) Com os ids dos livros em mãos, posso pegar todos os pares (id_autor, id_livro) da tabela Intermediaria: SELECT auli.id_livro, auli.id_autor FROM Intermediaria AS auli WHERE auli.id_livro IN ( ... ) Porém, como nós queremos na verdade os pares (título do livro, nome do autor), fazemos um JOIN com as tabelas de autor e livro, que contém essa informação: SELECT li.titulo, au.nome FROM Intermediaria AS auli JOIN Autor AS au ON (au.id_autor = auli.id_autor) JOIN Livro AS li ON (li.id_livro = auli.id_livro) WHERE auli.id_livro IN ( ... )
  8. Firebird Select de todos os autores de um livro quando um autor X está entre eles

    Teria como ser mais específico? Quais são os campos dessas tabelas? Livro (id_livro, titulo), Autor(id_autor, nome), Intermediaria (id_autor, id_livro)? A busca é por um livro específico e um autor, OU é apenas por autor (devendo retornar todos os livros dele com todos os autores desses livros)?
  9. C Validar CPF - Linguagem C no DEV-C++

    Você quer long long, não short. short usa 16 bits e armazena números de -32.768 a 32.767 int usa 32 bits e armazena números de -2.147.483.648 até 2.147.483.647 long long usa 64 bits e armazena números de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Como o CPF tem 9 dígitos, cabe em um int. Mas se você vai multiplicá-lo por 100, precisa de um long long. Detalhe: use %lld no scanf/printf para long long, em vez de %d.
  10. C Números primos positivos em C

    Números primos e compostos Número primo: um inteiro x maior do que 1 é dito primo se possui exatamente dois divisores inteiros positivos: 1 e x. Número composto: todo inteiro maior do que 1 que não é primo é dito composto. Por exemplo: - 7 é primo porque os únicos inteiros positivos que dividem 7 são 1 e 7. - 21 não é primo porque é divisível por 1, 3, 7 e 21, possuindo quatro divisores. Logo, é composto. Todo número composto pode ser fatorado em um produto de números primos. Por exemplo, 42 = 2 * 3 * 7. Isso significa que pra gerar um número composto basta pegar 2 ou mais números primos (não necessariamente distintos) e multiplicá-los. Exemplos: - 2 * 2 = 4 - 3 * 5 = 15 - 3 * 5 * 7 = 105 Não preciso nem falar que se multiplicarmos qualquer número composto por qualquer outro inteiro positivo teremos um número composto. Se isso não está óbvio pra você, releia até ficar. Crivo Vamos encontrar todos os primos até n. A ideia do Crivo é bem simples. Vamos nos basear no fato de que se um número x é primo, então 2x, 3x, 4x, ..., ⌊n/x⌋x não são primos. Isso é óbvio, porque se multiplicamos um primo por qualquer outro número inteiro maior que 1 ele vira composto. Ou seja, todo múltiplo de um primo é composto... O primeiro passo do crivo consiste em: 1. Criar um array ehPrimo de tamanho n+1 e marcar ehPrimo[x] para x > 1 com o valor 1. Aqui, 1 indica que é primo, 0 indica que não é. Até que provemos que um número é composto, vamos assumir que ele é primo. int ehPrimo[n+1] = {0, 0}; int i; for (i = 2; i <= n; i++) ehPrimo[i] = 1; Agora, vamos criar um x = 2 e repetir os passos a seguir até chegarmos em x = n. 1. Se x é primo, percorra todos os múltiplos de x (2x, 3x, 4x, ...) e marque-os como não primos, ou seja, ehPrimo[2x] = 0, ehPrimo[3x] = 0, ... 2. Incremente x e volte para o passo 3. int x; for (x = 2; x <= n; x++) { if (ehPrimo[x]) { for (i = 2; i*x <= n; i++) ehPrimo[i*x] = 0; } } Repare que ao fim do algoritmo, vamos ter marcado TODO múltiplo de um primo com 0. Já os números primos não são marcados, porque nós só marcamos números que podem ser obtidos pelo produto de outros dois números (maiores que 1): i*x. Se eu pudesse obter um número y pelo produto de i*x, esse y não seria primo, seria composto. Pronto, agora temos um array ehPrimo que nos diz se um certo número entre 0 e n é primo. Na Wikipedia tem um GIF bem interessante que mostra o funcionamento do algoritmo para n=120: https://pt.wikipedia.org/wiki/Crivo_de_Eratóstenes#Visualiza.C3.A7.C3.A3o_do_Crivo Otimizações 1. Em vez de começar a partir de i = 2, podemos começar a partir de i = x no segundo for. Podemos fazer isso porque ao chegar, por exemplo, no primo x = 7, já marcamos 2*7, 2*(2*7), 2*(3*7), ..., como não primo quando tínhamos x = 2; marcamos 3*7, 3*(2*7), ..., quando estavamos no x = 3; e marcamos 5*7, ..., no x = 5. Ou seja, todo i*7 com i < 7 já foi marcado em algum dos x anteriores, e podemos portanto começar do i = x. 2. Podemos ir de x = 2 até raiz(n) em vez de ir até n. Se você entendeu a otimização 1, deve entender também porque isto funciona. O motivo é o mesmo.
  11. @Gabriel Torres Após esse último tópico elas realmente tinham sumido. Fiquei um tempo praticamente sem acessar o CDH, e voltei ontem (acho), e elas estão aparecendo o tempo todo de novo, causando os mesmos problemas. São exatamente as mesmas ads de antes.
  12. C Números primos positivos em C

    O crivo funciona até qualquer número na verdade, só que é limitado pela quantidade de memória (se quiser saber se um número N é primo, precisa de raiz(N) de memória). Mas pra essa questão você não precisa dele, pode ir com a solução simples mesmo. Se quiser entender o crivo, posso te explicar.
  13. C Números primos positivos em C

    Lol, eu lembro de ter cometido esse mesmo erro em 2009 em uma competição (ou foi na OBI?) quando eu tava começando a programar em C . Se um número não é divisível por 2, 3, 5 ou 7 não significa que seja primo. Por exemplo, 121 = 11*11 e portanto não é primo, mas seu código dirá que é porque não é divisível por nenhum primo de 2 a 7. Não tem como você colocar todos os primos na mão aí... vai ter que usar um laço de repetição. adicionado 2 minutos depois Ah, mais uma dica pra acelerar o código. Mas só leia este comentário depois de conseguir fazer funcionar do jeito mais simples possível. Você não precisa checar se o número N é divisível por algum número entre 2 e N-1. Pode verificar apenas se é divisível por algum número entre 2 e raiz(N).
  14. Xeon 5462 por $9 ?

    É muito inferior em single thread a qualquer processador atual, mas em multithreading está no nível de um Celeron (2C/2T) ou Pentium (2C/4T) dependendo da tarefa. Mas são $9 = R$ 28. Um celeron custa uns R$ 150. Se a intenção é montar um computador simples e se achar uma placa-mãe bem barata pra ele (vi umas por uns R$ 100 a R$ 120 no aliexpress) vale a pena. Pela avaliação do pessoal eu diria que é seguro comprar.
  15. i5 7600k e gtx 1060 sofrendo para rodar o Black Desert

    Como existem várias pessoas com problemas com esse jogo, eu te recomendo ir no fórum do jogo perguntar. Bastante possível que alguém que já teve exatamente o mesmo problema possa te dizer como resolveu.

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

×