Live2D

手速最快的蓝人

总时间限制: 1000ms
内存限制: 64 MB

描述

泰神是公认的104手速最快的蓝人,凭借惊人的手速在CF上成为了蓝泰(恩,马上就要紫泰了)。打代码不仅手速要快,而且姿势也得帅。但是由于手速太快,难免出现错误。某次泰神打完20个字符后,勋总发现,泰神在第1,3,7,9,11,13,17,19个字符的时候发生了错误(巧合的是这些数和20都是互素的)。经过长时间的观察,勋总发现泰神打代码出现错误的地方是有规律的。规律就如上诉所述(即第i个字符会出错,i与n互素且i<n)。一天泰神准备打含有n个字符的代码,勋总想算一下泰神有几个字符打错了。但是勋总发现泰神打的代码实在太多了,根本数不过来。这是他想起了一句至理名言:“放弃能解决百分百的问题”。于是他果断放弃,打算让你来帮他算。

输入格式:

输入整数n(2 <= n <= 20000000)表示泰神要打的代码的长度。

输出格式:

一个整数(出现错误的个数)。

样例输入

10

样例输出

4

来源

蓝桥校选试题

#include <bits/stdc++.h>
bool isprime[20000001];
int main(void)
{
    int i, j,n,ans=0;
    scanf("%d", &n);
    memset(isprime,true, sizeof(isprime));
    isprime[0] = false;
    for (i = 2; i <= n; i++)//约数一定不是
        if (n % i == 0)
            isprime[i] = false;
    for (i = 2; i <= n; i++)
        if (isprime[i] == false)//约数的倍数一定不是
            for (j = 2 * i; j <= n; j += i)
                isprime[j] = false;
    for (i = 1; i < n; i++)
        if (isprime[i])
            ans++;
    printf("%d", ans);
    return 0;
}

解题思路

数据不算太大,定义数组存放是否符合,先把约数标记,把约数的倍数标记,还是有重复,起码过了

总结

第二次做到反而不会了,嗯...要加强看题解了,对素数筛还不熟.
posted @ 2020-04-17 21:53  风吟承渊  阅读(171)  评论(0)    收藏  举报