最简真分数

最简真分数

Problem Description

统计分母在指定区间[a,b]的最简真分数(分子小于分母,且分子分母无公因数)共有多少个,并求这些最简真分数的和(保留5位小数)。

Input

每行2个整数,分别表示a和b

Output

每行2个整数,分别表示最简真分数的个数和最简真分数的和

Sample Input

3 20

Sample Output

126 63.00000

解释:

这个题目,没有给定数据的范围,推测可能数据量不大,一般我们学校这种没有给定数据范围的题目,就暗示数据不大。按照常规思路。从a到b,开始遍历,然后遍历1..i, 再看是不是最简真分数。

 1 /*
 2   
 3 */
 4 #include<bits/stdc++.h>
 5 
 6 using namespace std;
 7 const int N = 1000;
 8 
 9 double sum_nums[N];
10 int sums[N]; 
11 
12 int main(){
13     sum_nums[0] = sum_nums[1] = 0;
14     for (int i = 2; i < N; i++){
15         sum_nums[i] = sum_nums[i-1] + (double)1 / double(i);
16         sums[i] = sums[i-1] + 1; 
17         for (int x = 2; x < i; x++){
18             int flag = 0;
19             for (int t = 2; t <= x; t++){
20                 if (i % t == 0 && x % t == 0){
21                     flag = 1;
22                     break; 
23                 } 
24             } 
25             if (!flag) {
26                 sum_nums[i] += ((double)x / double(i)); 
27                 sums[i] ++; 
28             }
29         }
30     }
31     int a, b;
32     while (~scanf("%d %d", &a, &b))
33         printf("%d %.5lf\n", sums[b]-sums[a-1], sum_nums[b] - sum_nums[a-1]); 
34     return 0;
35 }
View Code

这种数据数字的特征,与输入无关。例如 [1, 5] 的答案,不会因为你的输入时[1, 6]就会改变,一般采用打表记录的方式。

posted @ 2019-07-18 14:16  龚政  阅读(981)  评论(0编辑  收藏  举报