【练习】PAT 乙 1087 有多少不同的值

题目

当自然数 n 依次取 1、2、3、……、N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分。)

输入格式:

输入给出一个正整数 N(2≤N≤10 4 )。

输出格式:

在一行中输出题面中算式取到的不同值的个数。

输入样例:

2017

输出样例:

1480

来源:PAT 乙 1087 有多少不同的值


思路(注意事项)

初始化一个大数组用来标记值是否已出现过。


纯代码

#include
using namespace std;

const int N = 1000010;
int a[N];

int  main(){
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++){
        int tmp = i / 2 + i / 3 + i / 5;
        if (a[tmp] == 0) a[tmp] = 1;
    }

    int sum = 0;
    for (int i = 0; i < 1000010; i ++) 
        if (a[i] == 1) sum ++;

    cout << sum;
    return 0;
}

题解(加注释)

#include
using namespace std;

const int N = 1000010;  // 定义常量N作为数组大小
int a[N];               // 定义全局数组a,用于标记出现过的数值

int main() {
    int n;
    cin >> n;  // 输入整数n

    // 遍历1到n的每个数字i
    for (int i = 1; i <= n; i++) {
        // 计算i/2 + i/3 + i/5的值(整数除法)
        int tmp = i / 2 + i / 3 + i / 5;
        
        // 如果这个值是第一次出现,标记为1
        if (a[tmp] == 0) {
            a[tmp] = 1;
        }
    }

    int sum = 0;  // 初始化计数器sum
    // 遍历整个数组,统计有多少个不同的值出现过
    for (int i = 0; i < N; i++) {
        if (a[i] == 1) {
            sum++;  // 每遇到一个标记过的值,计数器加1
        }
    }

    cout << sum;  // 输出不同值的总数
    return 0;
}

你可能感兴趣的:(PAT,题解,输入输出,算法,数据结构,c++)