最簡真分數就是分子小於分母且分子分母的最大公約數爲1(即無除了1以外的公約數)。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <cctype>
#include <climits>
using namespace std;
const int MAXN = 605;
const int INF = INT_MAX;
int GCD(int a, int b){
if(b == 0) return a;
else return GCD(b, a%b);
}
int main(){
// freopen("in.txt", "r", stdin);
int n;
int arr[MAXN];
while(~scanf("%d", &n)){
if(n == 0) break;
for(int i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
sort(arr, arr+n);
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
if(GCD(arr[i], arr[j]) == 1) ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
素數篩模板題。
編譯器吃不消1000000^2的數據,但是oj評測系統吃得消,所以這題告訴我們oj的內存要遠大於編譯器。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <cctype>
#include <climits>
using namespace std;
const int MAXN = 1000005;
const int INF = INT_MAX;
bool isPrime[MAXN];
vector<int> prime;
void Initial(){
for(int i = 2; i < MAXN; i++){
isPrime[i] = true;//打假
}
for(int i = 2; i < MAXN; i++){
if(!isPrime[i]) continue;
prime.push_back(i);
for(int j = i*i; j < MAXN; j += i){
if(isPrime[j]) isPrime[j] = false;
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
int k;
Initial();
while(~scanf("%d", &k)){
printf("%d\n", prime[k-1]);
}
return 0;
}