a<b인 경우엔느 a%b=a이므로 자동으로 a와 b가 바뀌게 된다. 그러므로 따로 대소관계를 비교해줄 필요가 없다.
세 개이상의 최대공약수는 **GCD(a,b,c)=GCD(GCD(a,b),c)**와 같은 식으로 계속해서 구할 수 있다.
최소공배수(Least Common Multiple)
두 수의 공통된 배수 중에서 가장 작은 정수이다. 최소공배수는 최대공약수를 이용해서 구할 수 있다. 이 때, 최소공배수는 두 수보다 큰 수이므로 범위를 잘 확인해서 구해야한다.
**최대공약수 * 최소공배수 = A*B**이다.
즉, **최소공배수 = (A*B)/최대공약수**이다.
#include<iostream>usingnamespace std;intgcd(int a,int b){if(b==0)return a;else{returngcd(b,a%b); }}intmain(){int a,b,g,l;scanf("%d%d",&a,&b); //이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다. g=gcd(a,b); //최대공약수 l=(a*b)/g; //최소공배수printf("%d\n%d",g,l);}
#include<iostream>usingnamespace std;intgcd(int a,int b){if(b==0)return a;else{returngcd(b,a%b); }}intmain(){int a,b,g,l,t;scanf("%d",&t);while(t--){scanf("%d%d",&a,&b); //이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다. g=gcd(a,b); l=(a*b)/g;printf("%d\n",l); }}
//양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.#include<iostream>usingnamespace std;intgcd(int a,int b){if(b==0)return a;elsereturngcd(b,a%b);}intmain(){int t;scanf("%d",&t);while(t--){int n;intnum[101]={0};scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&num[i]);longlongint sum=0;for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){ sum+=gcd(num[i],num[j]); } }printf("%lld\n",sum); }}
진법 변환
10진법 수 N을 B진법으로 바꾸려면 N이 0이 될때까지 나머지를 계속해서 구하면된다.
ex)11을 3진법으로 바꾸는 방법
11/3=3...2
3/3=1...0
1/3=0...1
정답 102
#include<cstdio>#include<string>#include<iostream>usingnamespace std;string eight[8] = {"000","001","010","011","100","101","110","111"};intmain(){ string s; cin >> s;bool st =false;if(s.length() ==1&&s[0]-'0'==0)cout <<"0";for(int i =0;i <s.length();i ++){int n =s[i]-'0';if(!st && n <4){if(n ==0) continue;elseif(n ==1) cout <<"1";elseif(n ==2) cout <<"10";elseif(n ==3) cout <<"11"; st =true; }else{ cout <<eight[n]; st =true; } }return0;}
8 to -2
-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.
나머지가 음수가 나오면 안된다.
양수/-2
2로 나누어 떨어지는 경우
음수/-2
2로 나누어 떨어지는 경우
/* 8진수가 주어졌을 때, 2진수로 변환하는 프로그램을 작성하시오. 첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다. 첫째 줄에 주어진 수를 2진수로 변환하여 출력한다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다.*/#include<algorithm>#include<string>#include<iostream>usingnamespace std;intmain(){int n;scanf("%d",&n); string ans="";if(n==0)printf("%d",n);while(n!=1){if(n>0){if(n%(-2)==0){ ans+='0'; }else{ ans+='1'; } }else{if(n%(-2)==0){ ans+='0'; }else{ ans+='1'; n-=1; } } n/=-2; } ans+='1';reverse(ans.begin(),ans.end()); cout << ans;}
A to B
A진법을 B진법으로 바꾸기
A진법 -> 10진법 -> B진법
#include<iostream>usingnamespace std;voidconvert(int num,int base) {if (num ==0) return;convert(num/base, base);printf("%d ",num%base);}intmain() {int a,b; cin >> a >> b;int n; cin >> n;int ans =0;for (int i=0; i<n; i++) {int x; cin >> x; ans = ans * a + x; }convert(ans,b);return0;}