[백준 C++] 9613 GCD합
문제
양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진다. 입력으로 주어지는 수는 1,000,000을 넘지 않는다.
출력
각 테스트 케이스마다 가능한 모든 쌍의 GCD의 합을 출력한다.
풀이
먼저 최대공약수를 구하는 가장 쉬운방법인
유클리드 호제법을 이용한다.
int GCD(int a, int b){
int temp;
while(b != 0){
temp = a % b;
a = b;
b = temp;
}
return a;
}
여기서 a, b대소관계 상관없다.
또 눈여결볼점은 GCD를 구할 n의갯수는 최대 100이니, 이경우 n(n-1)/2 이며, 입력으로주어지는수가 100만이므로= > 5099백만 => 약49억인데, int의범위는 +- 21억이고, unsigned int가 + 42억이므로, long long(+-900경) 을 사용해야한다.
문제는 printf에서 long long형은 %lld 로출력해야한다.
long, long long, double, long double출력용 서식문자
long => %ld
unsigned int => %u
long double => %lf
double => %e %E
아래는 전체 코드이다.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
int GCD(int a, int b) {
int temp;
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
int main(void) {
int t = 0;
scanf("%d", &t);
while (t--) {
int n = 0;
scanf("%d", &n);
int* numbers = new int[n];
for (int i = 0; i < n; i++)
scanf("%d", &numbers[i]);
long long res = 0;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++) {
res += GCD(numbers[i], numbers[j]);
}
printf("%lld\n", res);
}
return 0;
}
Author And Source
이 문제에 관하여([백준 C++] 9613 GCD합), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cldhfleks2/백준-C-9613-GCD합저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)