No algoritmo de Euclides para encontrar o princípio maior comum divisor (GCD) e aplicação simples

Primeiro, o algoritmo de Euclides e sua prova

1. Definições:

algoritmo de Euclides conhecido como algoritmo de Euclides, um divisor comum maior de dois números, calculado como GCD (a, b) = GCD (b, a% b);

2. A prova:

X é um número inteiro de dois conjuntos de um, b (a> = b), o maior divisor comum, então x | um, x | b;

① divisão por um transitória (se divisível x a, x b divisível, então x é divisível a, b combinação linear arbitrária) da conhecidos x | ab &;

② b x factor não é fornecido, então x ab e b não são factores comuns, em que x não é um factor, então x ab e b não são factores comuns, pode ser derivada GCD (a, b) = GCD (b, ab);

③> = b é conhecido a partir de um, um pode ser expressa como a = b * q + r; q é subtraído um número restante é o b-r, de modo GCD (a, b) = GCD (b, a% b );

3. Código Geral:

(1) forma recursiva:

                        int gcd(int a,int b){return b?gcd(b,a%b):a;}

(2) forma iterativa:

                        int gcd(int a,int b){  
                                  for(;;) {  
                                        if(b==0)return a;  
                                        int temp=a%b;  
                                        a=b;
                                        b=temp;
                                  }  
                              }  

4. Várias propriedades:

(1) Quando o GCD (a, b) = 1, então a, b duas número primo.

(2) GCD (a, 2a) = a;

(3) GCD (a, 0) = a;

(4) GCD (a, b) = GCD (-a, b) = GCD (a, -b) = GCD (-a, -b);

o LCM (A, B) (5.) GCD (A, B) = A B (LCM é um múltiplo comum do número dois);

(6) GCD (n, n + 1) = 1;

prova:

Supondo que eles não são primos entre si, um fator comum q

n = p1 * 1, n + 1 = P2 * q; n + 1 - N = q (p2 - p1)

Em seguida, q (P2-P1) = 1, em que P2, P1 são números inteiros, q> = 2, que variam de licença. Provado.

Em segundo lugar, tópicos relacionados

1. [Luo Gu P1372] é graduação temporada eu

Descrição

O professor queria destacar os maiores indivíduos envolvidos em compreender a extensão k vestido de festa de formatura ensaio. Mas como escolher isso? O professor listados a classe do número 1, 2, ......, n, k e creio compreender a extensão do indivíduo é o seu maior divisor comum (isto não é uma superstição oh). Isso pode ser difícil para ele, por favor, ajudem! PS: um número que é o maior divisor comum em si.

Formato de entrada: dois inteiros n e k positivos separados por espaços. (N> = k> = 1)

formato de saída: um número inteiro, o valor máximo de compreensão.

Solução

1. Nota: "o maior divisor comum de um número que em si é": podemos considerar a natureza (2): Quando o número é um múltiplo de dois, o maior divisor comum do número que é menor, então o outro caso opostas da mesma faixa a combinação destes dois número relativamente grande do maior divisor comum.

2. Na discussão de alguns casos especiais: quando k = 1, n = ans; k = 2, se n for mesmo, a ans = n / 2, se n for ímpar, ANS = (n-1) / 2 ;

3. Descobrimos que a discussão acima: satisfazer k * a <n, o valor máximo de um é a resposta. Isto é, as figuras foram seleccionados um, 2a, 3a, ......, ka, de modo que a resposta é a / b;

Código

#include <iostream>
 usando  namespace std;
int main ()
{
    int a, b;
    cin >> >> uma b;
    cout << a / b << " \ n " ;
    retornar  0 ;
}

2. [Luo Gu P1170] Pernalonga eo Caçador

Descrição

Bugs Bunny esconderijo no pomar ao lado do bosque. árvores de pomar N x m, constituídas por uma matriz de filas e colunas M N, horizontalmente ou verticalmente adjacente a uma distância de duas árvores. Pernalonga em menos de uma árvore frutífera. Hunter carregando uma espingarda para o pomar, ele escalou uma árvore de fruta, pronto para matar Bugs Bunny. Se há outras árvores frutíferas entre Hunter e Pernalonga, os caçadores podem ver Bugs Bunny. caçadores agora conhecidos e Bugs Bunny localização, localização procedimentos escritos para determinar onde o coelho é seguro.

Formato de entrada: primeira linha n, expressa n (n ≤ 100.000) conjuntos de dados, cada dados dos dois primeiros atos de machado inteiros positivos e ay, indicando a posição do caçador, uma segunda bx comportamento e por dois inteiros positivos, erros representa uma posição (1 ≤ ax, Ay, bx, por ≤ 100000000).

Formato de Saída: Um total de n linhas, cada comportamento "sim" ou "não" Erros expressas posição do coelho é seguro.

Solução

1. Depois de ler o título, podemos simplificar o tópico: se há mais coordenadas inteiro estão buscando dois pontos sobre o inteiro ponto de coordenadas determinada linha reta entre dois pontos;

2. Podemos, então, coordenadas Hunter como a origem do sistema de coordenadas é estabelecida, desde o caçador (x1, y1), coelho (x2, y2), então nós mudamos a coordenadas de coelho (x2-x1, y2-y1);

3. Assim como você determinar que nenhum outro coordenadas ponto inteiro entre a origem eo ponto de ele? Ao desenhar podemos encontrar, enquanto as coordenadas do ponto em que é relativamente primos para satisfazer as necessidades, pela natureza do (1) é equivalente ao GCD conhecido (x, y) = 1;

4. Sabemos que pela natureza do (4), dois números símbolo do mesmo não afeta o número de coordenadas tomando o valor absoluto do maior divisor comum de modo recálculo;

5. Note que essa pluralidade problema de conjuntos de dados;

Código

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}   //GCD;
int main(){
    int n,x1,x2,y1,y2,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;++i){
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        if(x1==x2&&y1==y2){  //特判,两者坐标重合时,GCD=0,而兔子有危险;
            printf("no\n");
            continue;
        }
        x2=abs(x2-x1);
        y2=abs(y2-y1);
        if(gcd(x2,y2)==1)printf("no\n");
        else printf("yes\n");
    }
    return 0;
} 

3. [Luo Gu P2651] adicionam parentesis III

Descrição

Agora dá uma expressão da forma A1 / A2 / A3 /.../ um; calculado se directamente, isto é, com excepção da última, tal como 1/2/1/4 = 1/8. Uma fração pequena, no entanto ver um sentimento muito desconfortável, eu espero adicionar alguns suportes de modo que se torna um inteiro. Uma abordagem possível é a (02/01) / (1/4) = 2. Agora dado esta expressão, para perguntar se você pode torná-lo um inteiro adicionando alguns parênteses para alterar a ordem das operações.

Formatos de entrada: um ponto de teste, haverá múltiplas expressões. A primeira linha de t, indica o número de expressões. Para cada expressão, uma primeira fila é N, o número de segunda linha n, indica o i-ésimo ai.

formato de saída: linhas de saída t. Para cada expressão, se você pode fazê-lo em um inteiro, adicionando parênteses para alterar a ordem, então a saída "Sim", caso contrário, um "Não"

Solução

1. Podemos ver que, a fim de tornar os resultados como um número inteiro, devemos minimizar os máximo denominador, moléculas;

2.那么我们发现,a2无论如何都是在分母上的,那么我们这样添加括号即可:a1/(a2/a3/.../an)=a1a3...*an/a2,此时满足分母最大,分子最小;

3.那么我们需要进行约分:对每一个分子都和分母求一次GCD,每次求后令分母除以GCD,到最后一项时若分母=1,则结果为整数;

4.注意本题有多组数据;

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;} //GCD
int main(){
    int t,n,i,j;
    scanf("%d",&t);
    for(i=1;i<=t;++i){
        scanf("%d",&n);
        int a[n+1]={};
        for(j=1;j<=n;++j) scanf("%d",&a[j]);
        a[2]/=gcd(a[1],a[2]);
        for(j=3;j<=n;++j) a[2]/=gcd(a[2],a[j]);
        if(a[2]==1)printf("Yes\n");
        else printf("No\n");
    }
    return 0; 
} 

[洛谷P1029]最大公约数与最小公倍数问题

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8514163.html

[CodePlus 2017 11月赛]晨跑

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8514190.html

[BZOJ 2257][JSOI 2009] 瓶子和燃料

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8995031.html

Acho que você gosta

Origin www.cnblogs.com/lixuejian/p/12467008.html
Recomendado
Clasificación