给出1个数n,统计2到n这n-1个数,除1以外最小的约数是多少。
例如:n = 6,2到6这5个数,
除了1之外最小约数为2的包括:2 4 6
除了1之外最小约数为3的包括:3。
除了1之外最小约数为4的没有。
除了1之外最小约数为5的包括:5。
除了1之外最小约数为6的没有。
因此,按照数量逐个输出:
3
1
0
1
0
输入
输入1个数n(n < 10000)
输出
输出n-1行,分别对应除了1以外最小约数为2到n的数字的数量。
输入样例
6
输出样例
3
1
0
1
0
题解:
题意就是求出2 ~ n这n-1个数中,每个数的最小约数,然后判断2 ~ n这些数分别是几个数的最小约数。
注意:n的范围1e4,不可以开到O(n3)循环
看下面的代码,就是求出2 ~ n的最小约数,放到map中,map的key就是最小约数,value就是这个数出现的次数,然后从2 ~ n输出即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e5+5;
int n;
map <int,int> mp;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin >> n)
{
for(int i = 2; i <= n; i++)
{
for(int j = 2; j <= i; j++)
{
if(i % j == 0)
{
mp[j]++;
break;
}
}
}
for(int i = 2; i <= n; i++)
{
cout << mp[i] << endl;
}
}
return 0;
}