【详解打表】#26 A. Almost Prime

A. Almost Prime
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

A number is called almost prime if it has exactly two distinct prime divisors. For example, numbers 6, 18, 24 are almost prime, while 4, 8, 9, 42 are not. Find the amount of almost prime numbers which are between 1 and n, inclusive.

Input

Input contains one integer number n (1 ≤ n ≤ 3000).

Output

Output the amount of almost prime numbers between 1 and n, inclusive.

Sample test(s)
input
10
output
2
input
21
output
8


这道题呢, 是问n以内的整数,恰好是两个质数的积的有多少个——

所以我们需要

1) 得出一个1500以内的质数表(为何不是3000?自个儿想咯~)好吧其实是因为,质数最少也是2,3000/2=1500……

2) 得到一个满足条件的almost_prime表

3) 获得答案列表,直接读表出结果


质数表怎么获得就不说了吧……

来个4位数以内的质数表以备以后可能用上:

const int prime[]=
{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,
1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,
2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,
4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,
5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353,6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,6883,6899,6907,6911,6917,
6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,7159,7177,7187,7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147,8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269,8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389,8419,8423,8429,8431,8443,8447,8461,8467,8501,
8513,8521,8527,8537,8539,8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,9059,9067,9091,9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,9203,9209,9221,9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,9341,9343,9349,9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973};//共1229个


这道题毕竟只要求了3000以内,比较少,所以感觉优化了素数表(空间换时间)就够了,于是试了试直接用素数表来解题:

#include <cmath> 
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int prime[]=
{
	2,3,5,7,11,13,17,19,23,29,
31,37,41,43,47,53,59,61,67,71,
73,79,83,89,97,101,103,107,109,113,
127,131,137,139,149,151,157,163,167,173,
179,181,191,193,197,199,211,223,227,229,
233,239,241,251,257,263,269,271,277,281,
283,293,307,311,313,317,331,337,347,349,
353,359,367,373,379,383,389,397,401,409,
419,421,431,433,439,443,449,457,461,463,
467,479,487,491,499,503,509,521,523,541,
547,557,563,569,571,577,587,593,599,601,
607,613,617,619,631,641,643,647,653,659,
661,673,677,683,691,701,709,719,727,733,
739,743,751,757,761,769,773,787,797,809,
811,821,823,827,829,839,853,857,859,863,
877,881,883,887,907,911,919,929,937,941,
947,953,967,971,977,983,991,997,1009,1013,
1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,
1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,
1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,
1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,
1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,
1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,
1453,1459,1471,1481,1483,1487,1489,1493,1499};

#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))

bool is_alpme(int i)
{
	bool flag=false;
	int pos=0,nbr=i;
	while(1)
	{
		if(prime[pos]>nbr)return false;
		if(flag==false && nbr%prime[pos]==0)
		{
			flag=true;
			while(nbr%prime[pos]==0)nbr=nbr/prime[pos];
		}
		else if(flag==true && nbr%prime[pos]==0)
		{
			nbr=nbr/prime[pos];
			while(nbr%prime[pos]==0)nbr=nbr/prime[pos];
			if(nbr==1)return true;
			else return false;
		}
		if(prime[pos]==1499)return false;
		pos++;
	}
}

int solve(int num)
{
	int ans=0;
	for(int i=1;i<=num;i++)
	{
		if(is_alpme(i))ans++;
	}	
	return ans;
	
}
int main()
{
	//freopen("out.txt","w",stdout);
	int num=0;
	cin>>num;
	cout<<solve(num);
	return 0;
}

以上这种方法毕竟打表的容量也不大,的Memory也是0K,时间为62ms,这道题看不出太大的影响,但是,如果是Multi-Cases呢,就会有重复运算了吧?

比如说 T<=10000,n<=100000的话,特别担心会出现TLE的情况呢,我们就空间换时间:

但是打表,也是有很多种方法的:

1)傻打表: (全答案打表法) 为啥叫傻打表?你们看这东西有多长就知道了……

打表方法:

修改main函数为如下:

int main()
{
	freopen("out.txt","w",stdout);
	for(int num=0;num<=3000;num++)
	cout<<solve(num)<<',';
	return 0;
}
获得答案表:

int alpme[]=
{
	0,0,0,0,0,0,1,1,1,1,2,2,3,3,4,5,5,5,6,6,7,8,9,9,10,10,11,11,12,12,12,12,12,13,14,15,
	16,16,17,18,19,19,19,19,20,21,22,22,23,23,24,25,26,26,27,28,29,30,31,31,31,31,32,33,
	33,34,34,34,35,36,36,36,37,37,38,39,40,41,41,41,42,42,43,43,43,44,45,46,47,47,47,48,
	49,50,51,52,53,53,54,55,56,56,56,56,57,57,58,58,59,59,59,60,61,61,61,62,63,64,65,66,
	66,66,67,68,69,69,69,69,69,70,70,70,70,71,72,73,74,74,74,74,74,75,76,77,78,79,80,81,
	82,82,82,82,83,84,84,85,85,85,86,87,88,89,90,90,91,91,92,92,92,92,92,93,94,94,94,95,
	96,97,98,98,98,98,98,99,100,101,101,102,103,104,104,104,105,105,106,106,107,107,107,
	107,108,109,110,111,111,112,113,114,115,116,116,116,117,118,119,120,121,122,123,124,
	124,125,125,125,126,127,128,128,128,128,128,128,129,129,129,130,131,132,132,132,132,
	132,133,133,134,135,135,136,137,138,139,139,139,140,141,141,141,141,141,142,142,143,
	144,144,144,145,145,146,147,147,147,147,148,148,149,150,150,150,151,152,152,152,152,
	152,153,153,153,154,155,155,155,156,157,157,157,158,159,160,161,162,162,163,164,165,
	166,167,167,167,167,168,168,168,168,168,169,169,170,170,170,171,172,173,173,174,175,
	176,177,178,179,180,180,180,181,182,183,184,184,184,185,186,186,187,187,187,188,188,
	189,189,189,189,189,190,191,191,191,192,193,193,194,194,194,194,195,196,196,197,197,
	197,198,199,199,200,200,200,200,201,202,203,203,203,203,204,205,205,206,206,207,208,
	209,209,209,210,211,212,213,214,214,214,215,215,216,216,216,217,218,219,219,220,220,
	220,220,221,222,223,223,224,225,226,226,226,226,226,227,228,229,230,230,231,232,232,
	232,232,233,233,233,233,234,235,235,235,235,236,236,236,236,237,238,239,240,240,240,
	241,242,243,244,244,244,244,245,246,246,246,246,246,247,247,248,248,248,249,249,250,
	251,252,252,253,253,254,255,255,255,256,257,257,258,259,260,260,261,262,262,262,262,
	263,263,263,264,265,265,265,266,267,268,268,268,269,269,270,271,271,271,272,272,273,
	274,275,275,276,276,277,277,277,277,277,278,278,279,280,280,280,280,281,281,282,282,
	283,284,285,286,287,287,287,288,289,290,291,291,291,292,293,293,294,294,295,296,296,
	297,297,297,298,298,298,299,299,299,300,301,302,303,303,303,303,303,304,304,305,306,
	306,307,308,308,309,309,310,311,311,312,312,312,313,313,314,315,315,315,315,316,317,
	317,317,317,317,317,318,319,320,320,320,321,321,321,322,322,322,323,323,323,323,323,
	323,323,324,325,326,326,326,327,327,328,329,329,329,330,331,332,333,333,334,334,335,
	336,336,336,336,336,336,336,336,337,338,338,338,339,339,339,340,341,342,342,342,342,
	342,343,343,344,344,344,345,346,347,347,348,348,348,349,350,351,351,351,352,352,353,
	353,353,353,354,355,356,357,358,358,358,359,359,360,361,361,362,363,364,364,364,364,
	365,366,366,367,368,368,368,368,369,370,371,371,371,372,373,374,374,374,375,376,377,
	378,379,379,379,379,379,379,380,380,380,381,381,382,383,383,383,383,383,383,383,383,
	384,385,386,386,387,387,387,388,389,389,390,390,390,391,391,391,391,391,392,393,393,
	394,395,396,396,396,397,398,398,398,399,400,400,401,402,402,403,403,404,405,406,406,
	406,407,408,408,409,409,410,411,411,412,412,412,413,414,415,416,417,417,417,417,418,
	419,419,419,419,419,420,420,421,421,422,423,423,423,423,423,423,424,424,424,424,424,
	424,424,425,426,427,427,428,428,429,430,430,430,430,431,432,433,434,434,435,436,437,
	437,438,438,438,438,438,439,439,439,439,439,439,440,440,441,442,443,444,444,445,445,
	446,447,448,448,449,449,449,450,451,451,451,451,451,451,451,452,452,452,453,453,454,
	455,456,456,457,458,458,459,460,460,461,461,461,462,463,463,463,464,465,465,465,465,
	466,467,467,468,469,469,469,469,470,471,472,472,473,474,475,476,476,476,477,478,479,
	480,480,480,480,480,481,481,481,481,482,483,483,483,483,483,484,484,485,485,485,485,
	486,487,487,488,489,489,489,489,490,491,492,492,492,493,493,493,493,494,495,496,496,
	497,497,497,498,498,499,500,500,500,501,501,501,501,502,502,502,503,504,504,505,505,
	505,506,507,508,508,508,509,510,510,511,512,512,512,512,513,513,513,513,513,514,515,
	516,516,516,516,516,516,516,517,517,518,519,520,520,520,520,520,520,520,520,521,521,
	521,521,522,523,524,524,524,525,526,527,527,527,527,528,529,529,530,530,531,532,533,
	533,533,533,533,533,533,533,534,534,534,534,534,535,536,536,537,538,539,539,540,540,
	541,542,543,544,544,544,544,545,546,546,546,546,546,547,547,548,548,548,549,549,550,
	550,550,550,550,550,551,552,552,552,553,554,554,555,556,556,556,556,557,557,558,558,
	558,559,560,561,562,562,562,562,562,563,564,564,565,566,567,568,569,569,570,571,572,
	572,573,573,574,574,575,575,575,576,576,577,577,578,579,579,580,580,581,581,581,581,
	582,582,583,584,585,585,585,586,586,587,588,588,589,589,590,590,590,590,591,592,592,
	593,593,593,594,594,595,596,596,596,597,597,597,598,599,599,599,600,601,601,602,602,
	603,604,604,604,605,605,605,606,607,608,608,608,609,609,609,609,609,609,610,611,612,
	613,613,613,613,613,614,615,615,615,615,616,616,616,617,617,618,619,619,619,620,620,
	620,621,622,623,624,624,625,626,627,627,627,627,628,629,630,631,631,631,632,633,634,
	634,635,635,636,636,636,636,636,636,636,637,637,638,638,638,639,640,640,640,640,640,
	640,640,641,642,642,643,643,643,644,644,644,644,644,645,645,646,646,646,646,646,646,
	647,648,648,649,649,650,651,651,651,651,652,653,654,655,655,655,656,657,657,657,657,
	658,658,658,659,660,660,661,661,662,662,663,663,664,665,666,667,668,668,669,670,670,
	671,672,672,673,673,674,674,674,674,675,675,675,676,676,676,676,676,677,678,678,678,
	679,680,681,681,682,682,682,683,684,685,686,686,687,688,689,689,690,690,691,691,691,
	692,693,693,693,693,694,695,696,696,697,697,697,698,698,698,699,700,701,701,702,702,
	703,704,704,704,705,705,705,706,706,706,706,706,706,706,707,708,708,708,708,709,710,
	711,711,711,712,712,712,713,714,714,714,715,715,715,715,715,715,716,716,716,717,718,
	718,718,719,719,719,719,720,721,722,723,724,724,724,725,726,726,727,727,728,729,729,
	729,729,729,729,729,729,730,730,730,730,730,730,731,731,731,731,731,732,732,732,732,
	733,734,735,736,736,736,737,737,738,738,738,738,739,740,740,741,742,742,743,743,744,
	745,745,745,746,746,747,748,749,749,749,750,750,750,751,752,753,754,755,755,756,756,
	756,757,757,758,758,758,758,758,758,759,759,759,760,761,762,762,762,762,763,763,764,
	764,765,765,765,766,767,767,767,767,768,769,769,770,771,771,771,771,771,771,771,771,
	772,772,773,774,775,775,776,777,778,779,779,779,779,779,779,780,780,780,781,782,782,
	782,782,782,782,782,783,783,783,783,783,784,784,785,785,785,785,786,787,787,788,788,
	788,788,789,789,790,790,791,791,791,792,792,792,793,793,794,795,796,796,796,797,798,
	799,800,800,801,801,801,802,803,803,803,804,804,804,805,805,805,806,806,806,806,806,
	806,806,807,807,808,808,809,810,810,811,812,812,812,813,813,814,815,815,816,817,818,
	818,819,819,819,819,819,820,820,820,820,820,821,821,822,822,822,823,824,824,824,824,
	825,826,827,828,829,829,830,831,832,832,832,832,832,833,833,834,835,836,836,836,837,
	838,838,838,839,839,840,840,841,841,841,841,841,842,843,843,843,843,843,843,844,844,
	844,845,845,846,847,847,847,847,848,849,850,850,851,852,852,852,853,853,853,854,855,
	856,857,857,857,857,858,858,859,859,859,860,860,860,860,860,860,860,861,862,863,863,
	864,865,866,866,867,867,867,867,868,868,869,869,870,871,872,872,872,872,873,874,874,
	875,876,876,877,877,878,879,879,879,880,880,880,881,882,882,882,883,883,883,884,884,
	885,886,887,887,888,888,889,890,890,890,890,890,890,890,891,892,893,893,893,894,895,
	896,897,897,897,897,898,899,900,900,900,901,901,901,901,901,901,902,903,903,903,903,
	903,903,903,904,905,905,905,905,905,906,906,906,907,907,908,909,910,910,911,911,912,
	912,912,912,913,913,913,914,914,914,915,915,915,916,916,916,917,918,919,919,920,920,
	921,922,923,923,923,923,924,925,926,926,926,926,926,927,927,928,929,929,930,930,931,
	932,933,934,935,935,935,936,936,936,936,937,937,938,938,938,939,939,940,940,941,941,
	942,943,943,944,945,945,946,946,947,947,947,947,948,948,949,949,949,949,950,951,952,
	953,954,954,954,954,954,954,955,955,955,956,956,957,957,957,957,958,958,958,958,958,
	959,959,960,961,962,962,962,963,963,963,963,963,963,964,965,965,966,966,967,967,968,
	969,969,969,969,969,970,971,972,972,972,973,973,974,974,974,975,976,977,977,978,978,
	979,979,980,980,981,981,981,981,981,982,983,983,984,984,985,986,986,986,986,987,987,
	987,987,987,988,988,989,989,990,990,991,992,992,992,992,992,992,993,993,993,993,993,
	993,993,993,994,994,994,995,996,997,998,998,998,999,1000,1001,1002,1003,1003,1004,1004,
	1004,1004,1004,1004,1004,1004,1004,1005,1006,1006,1007,1007,1007,1008,1009,1009,1010,
	1011,1012,1012,1012,1012,1012,1012,1013,1013,1013,1013,1013,1014,1014,1014,1014,1014,
	1014,1015,1015,1015,1016,1016,1017,1017,1018,1019,1019,1019,1020,1020,1021,1021,1022,
	1022,1022,1022,1022,1023,1024,1024,1025,1026,1027,1027,1028,1028,1029,1030,1030,1031,
	1032,1032,1032,1032,1033,1034,1035,1035,1035,1036,1036,1037,1038,1038,1039,1040,1040,
	1041,1042,1042,1042,1042,1043,1043,1044,1044,1044,1044,1044,1045,1045,1045,1045,1045,
	1045,1045,1045,1045,1046,1047,1048,1049,1050,1050,1050,1050,1050,1051,1052,1052,1053,
	1054,1055,1055,1056,1056,1056,1057,1057,1057,1057,1057,1057,1057,1058,1058,1058,1058,
	1059,1060,1060,1061,1062,1062,1062,1063,1064,1064,1064,1064,1065,1066,1067,1067,1067,
	1067,1068,1069,1069,1069,1069,1069,1069,1069,1070,1071,1071,1071,1071,1072,1072,1072,
	1073,1073,1073,1073,1074,1075,1076,1076,1076,1076,1076,1076,1077,1077,1077,1077,1077,
	1077,1077,1077,1078,1078,1078,1079,1080,1081,1082,1083,1084,1085,1085,1085,1085,1086,
	1087,1087,1088,1088,1089,1089,1090,1090,1091,1091,1092,1092,1092,1093,1094,1094,1095,
	1095,1095,1095,1095,1095,1096,1097,1097,1097,1097,1097,1097,1098,1098,1099,1099,1099,
	1099,1100,1101,1101,1101,1101,1102,1102,1102,1102,1102,1102,1103,1103,1104,1105,1106,
	1106,1106,1106,1107,1108,1109,1109,1109,1110,1110,1111,1112,1112,1112,1112,1112,1112,
	1112,1112,1112,1113,1113,1114,1114,1114,1114,1114,1115,1115,1115,1115,1116,1117,1117,
	1117,1117,1117,1117,1118,1119,1120,1120,1120,1121,1121,1121,1121,1121,1121,1122,1122,
	1122,1123,1123,1123,1124,1124,1125,1125,1125,1125,1126,1127,1128,1129,1130,1130,1130,
	1131,1132,1133,1134,1134,1134,1134,1135,1135,1135,1135,1136,1136,1136,1137,1137,1137,
	1138,1138,1138,1139,1140,1140,1141,1142,1142,1143,1143,1143,1144,1145,1146,1146,1146,
	1146,1146,1147,1148,1148,1149,1149,1149,1150,1150,1151,1151,1151,1152,1152,1153,1153,
	1154,1154,1154,1154,1155,1156,1157,1157,1158,1158,1159,1159,1160,1160,1161,1162,1162,
	1163,1164,1164,1164,1165,1165,1165,1166,1166,1167,1167,1168,1169,1170,1170,1171,1171,
	1172,1173,1174,1174,1174,1174,1175,1176,1177,1177,1178,1179,1180,1180,1180,1180,1181,
	1181,1181,1182,1183,1183,1183,1183,1183,1183,1183,1183,1184,1184,1185,1185,1185,1185,
	1185,1185,1185,1186,1186,1186,1186,1187,1188,1189,1190,1190,1191,1192,1192,1193,1194,
	1194,1195,1195,1196,1197,1198,1198,1199,1199,1200,1201,1201,1201,1202,1203,1203,1203,
	1203,1203,1204,1205,1206,1206,1206,1207,1207,1208,1208,1208,1209,1209,1210,1210,1211,
	1212,1213,1213,1214,1215,1215,1216,1216,1216,1217,1218,1218,1219,1220,1220,1220,1220,
	1221,1221,1221,1221,1222,1223,1223,1223,1224,1224,1225,1225,1226,1226,1226,1226,1226,
	1227,1228,1229,1229,1229,1230,1231,1232,1233,1234,1234,1234,1235,1236,1236,1237,1237,
	1238,1239,1239,1240,1240,1240,1240,1240,1241,1242,1242,1242,1242,1242,1242,1242,1243,
	1243,1243,1244,1245,1245,1246,1246,1246,1246,1246,1246,1247,1247,1247,1247,1247,1247,
	1247,1247,1247,1247,1247,1248,1248,1248,1248,1249,1249,1249,1249,1249,1250,1250,1250,
	1251,1252,1252,1252,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,
	1254,1255,1256,1256,1257,1257,1258,1258,1258,1258,1258,1259,1260,1261,1262,1262,1262,
	1263,1263,1263,1263,1263,1264,1265,1265,1266,1267,1267,1267,1267,1267,1268,1268,1268,
	1268,1268,1269,1269,1270,1270,1271,1272,1273,1274,1274,1274,1274,1275,1275,1275,1276,
	1276,1277,1277,1277,1278,1278,1278,1279,1279,1280,1280,1281,1281,1282,1282,1283,1283,
	1283,1283,1283,1284,1284,1284,1284,1284,1284,1285,1286,1286,1286,1286,1286,1287,1287,
	1287,1288,1288,1288,1288,1289,1289,1290,1290,1291,1292,1293,1294,1294,1294,1294,1294,
	1295,1296,1297,1297,1298,1298,1298,1298,1299,1299,1299,1299,1299,1300,1300,1300,1301,
	1301,1302,1302,1302,1302,1303,1304,1304,1305,1305,1305,1305,1305,1306,1307,1308,1308,
	1308,1309,1310,1310,1310,1310,1311,1312,1312,1313,1314,1314,1315,1315,1315,1316,1317,
	1317,1318,1319,1319,1320,1320,1320,1321,1321,1322,1322,1323,1323,1323,1324,1325,1325,
	1326,1326,1327,1328,1328,1329,1329,1329,1330,1330,1331,1332,1332,1332,1332,1333,1333,
	1334,1334,1334,1335,1335,1336,1336,1336,1337,1337,1338,1338,1338,1339,1339,1340,1340,
	1340,1340,1340,1340,1341,1341,1342,1343,1344,1344,1345,1346,1346,1346,1346,1346,1347,
	1348,1349,1350,1350,1350,1351,1351,1352,1352,1353,1353,1353,1353,1353,1354,1354,1354,
	1355,1355,1355,1356,1356,1356,1357,1358,1358,1358,1358,1358,1358,1359,1360,1361,1361,
	1361,1362,1363,1364,1364,1365,1365,1366,1367,1367,1368,1369,1369,1370,1370,1371,1371,
	1372,1372,1373,1373,1374,1375,1375,1375
};
使用答案表方法:

int main()
{
	int num=0;
	cin>>num;
	cout<<alpme[num];
	return 0;
}

结果:AC 0K 62ms 13871B


实际上,我们玩ACM的时候,该如何才能获得不那么难看的打表程序代码呢?

我们该打出来的其实并不应该是最终答案,而是过程答案,比如这道题的话就应该是满足条件的数表:

获得过程数表方法如下:

int solve(int num)
{
	int ans=0;
	for(int i=1;i<=num;i++)
	{
		if(is_alpme(i)){ans++;cout<<i<<',';
	}	
	return ans;
}
main函数如下:

	freopen("out.txt","w",stdout);
	int num=0;
	cin>>num;
	cout<<solve(num);//
	return 0;


打完表之后现在的代码:

#include <cmath> 
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int alpme[]=
{ 
	6,10,12,14,15,18,20,21,22,24,26,28,33,34,35,36,38,39,40,44,45,46,48,50,51,52,54,55,56,57,58,62,63,65,68,69,72,74,75,76,77,80,82,85,86,
	87,88,91,92,93,94,95,96,98,99,100,104,106,108,111,112,115,116,117,118,119,122,123,124,129,133,134,135,136,141,142,143,144,145,146,147,
	148,152,153,155,158,159,160,161,162,164,166,171,172,175,176,177,178,183,184,185,187,188,189,192,194,196,200,201,202,203,205,206,207,208,
	209,212,213,214,215,216,217,218,219,221,224,225,226,232,235,236,237,242,244,245,247,248,249,250,253,254,259,261,262,265,267,268,272,274,
	275,278,279,284,287,288,291,292,295,296,297,298,299,301,302,303,304,305,309,314,316,319,320,321,323,324,325,326,327,328,329,332,333,334,
	335,338,339,341,344,346,351,352,355,356,358,362,363,365,368,369,371,375,376,377,381,382,384,386,387,388,391,392,393,394,395,398,400,403,
	404,405,407,411,412,413,415,416,417,422,423,424,425,427,428,432,436,437,441,445,446,447,448,451,452,453,454,458,459,464,466,469,471,472,
	473,475,477,478,481,482,484,485,486,488,489,493,496,497,500,501,502,505,507,508,511,513,514,515,517,519,524,526,527,531,533,535,536,537,
	538,539,542,543,544,545,548,549,551,553,554,556,559,562,565,566,567,568,573,575,576,578,579,581,583,584,586,589,591,592,596,597,603,604,
	605,608,611,614,621,622,623,626,628,629,632,633,634,635,637,639,640,648,649,652,655,656,657,662,664,667,668,669,671,674,675,676,679,681,
	685,686,687,688,689,692,694,695,697,698,699,703,704,706,707,711,712,713,716,717,718,721,722,723,724,725,731,734,736,737,745,746,747,749,
	752,753,755,758,763,764,766,767,768,771,772,775,776,778,779,781,783,784,785,788,789,791,793,794,796,799,800,801,802,803,807,808,813,815,
	817,818,824,831,832,833,835,837,838,842,843,844,845,847,848,849,851,856,862,864,865,866,867,869,871,872,873,875,878,879,886,889,891,892,
	893,895,896,898,899,901,904,905,908,909,913,914,916,917,921,922,923,925,926,927,928,931,932,933,934,939,943,944,949,951,955,956,958,959,
	963,964,965,968,972,973,974,976,979,981,982,985,989,992,993,995,998,999,1000,1003,1004,1006,1007,1011,1016,1017,1018,1025,1027,1028,1029,
	1037,1041,1042,1043,1046,1047,1048,1052,1053,1055,1057,1058,1059,1067,1072,1073,1075,1076,1077,1079,1081,1082,1083,1084,1088,1089,1094,1096,
	1099,1101,1107,1108,1111,1112,1114,1115,1119,1121,1124,1125,1126,1127,1132,1133,1135,1136,1137,1138,1139,1141,1142,1143,1145,1147,1149,1152,
	1154,1156,1157,1159,1161,1165,1167,1168,1169,1172,1174,1175,1177,1179,1183,1184,1186,1189,1191,1192,1195,1198,1199,1202,1203,1205,1207,1208,
	1211,1214,1215,1216,1219,1225,1226,1227,1228,1233,1234,1238,1241,1243,1244,1247,1250,1251,1252,1253,1255,1256,1257,1261,1262,1263,1264,1267,
	1268,1269,1271,1273,1280,1282,1285,1286,1293,1294,1296,1299,1304,1306,1312,1313,1315,1317,1318,1322,1323,1324,1325,1328,1329,1333,1336,1337,
	1339,1341,1343,1345,1346,1347,1348,1349,1351,1352,1354,1355,1357,1359,1363,1366,1371,1372,1375,1376,1377,1379,1382,1383,1384,1385,1387,1388,
	1389,1391,1393,1396,1397,1401,1402,1403,1405,1408,1411,1412,1413,1415,1417,1418,1421,1424,1431,1432,1436,1437,1438,1441,1444,1445,1448,1454,
	1457,1458,1461,1465,1466,1467,1468,1469,1472,1473,1475,1477,1478,1486,1492,1497,1501,1502,1503,1504,1507,1509,1513,1514,1516,1517,1519,1521,
	1522,1525,1527,1528,1529,1532,1535,1536,1537,1538,1539,1541,1544,1546,1552,1555,1556,1557,1561,1563,1565,1568,1569,1573,1574,1576,1577,1585,
	1587,1588,1589,1591,1592,1593,1594,1600,1603,1604,1611,1616,1618,1622,1623,1625,1629,1631,1633,1636,1639,1641,1642,1643,1646,1647,1648,1649,
	1651,1654,1655,1658,1661,1664,1671,1673,1675,1676,1678,1679,1682,1684,1685,1687,1688,1689,1691,1696,1701,1703,1706,1707,1711,1712,1713,1714,
	1715,1717,1718,1719,1724,1726,1727,1728,1731,1732,1735,1737,1739,1744,1745,1751,1754,1756,1757,1761,1762,1763,1765,1766,1769,1772,1773,1774,
	1775,1779,1781,1784,1791,1792,1793,1795,1796,1797,1799,1803,1805,1807,1808,1809,1813,1814,1816,1817,1819,1821,1822,1825,1828,1829,1832,1835,
	1837,1838,1839,1841,1843,1844,1851,1852,1853,1856,1857,1858,1859,1863,1864,1865,1868,1874,1875,1882,1883,1888,1891,1893,1894,1895,1897,1899,
	1903,1906,1909,1912,1915,1916,1917,1919,1921,1922,1923,1927,1928,1929,1934,1936,1937,1939,1941,1942,1943,1944,1945,1948,1952,1954,1957,1959,
	1961,1963,1964,1966,1967,1969,1971,1975,1977,1981,1982,1983,1984,1985,1991,1994,1996,2000,2005,2007,2008,2009,2012,2018,2019,2021,2023,2025,
	2026,2031,2032,2033,2036,2038,2041,2042,2043,2045,2047,2049,2051,2056,2057,2059,2061,2062,2066,2071,2073,2075,2077,2078,2084,2092,2095,2096,
	2097,2098,2101,2102,2103,2104,2105,2107,2116,2117,2119,2122,2123,2125,2126,2127,2133,2138,2144,2147,2149,2151,2152,2155,2157,2159,2164,2165,
	2167,2168,2169,2171,2173,2174,2176,2177,2181,2182,2183,2186,2188,2189,2191,2192,2194,2195,2199,2201,2206,2215,2216,2217,2218,2219,2224,2225,
	2227,2228,2229,2231,2234,2241,2245,2246,2248,2249,2252,2253,2257,2258,2259,2263,2264,2271,2272,2276,2279,2283,2284,2285,2291,2299,2302,2303,
	2304,2305,2306,2307,2308,2312,2313,2315,2317,2319,2321,2323,2326,2327,2329,2335,2336,2342,2344,2348,2349,2353,2359,2361,2362,2363,2367,2368,
	2369,2372,2374,2375,2384,2386,2391,2395,2396,2402,2403,2404,2407,2413,2416,2419,2421,2425,2426,2427,2428,2429,2432,2433,2434,2435,2439,2443,
	2446,2449,2452,2453,2455,2456,2458,2461,2462,2463,2468,2469,2471,2474,2476,2479,2481,2483,2487,2488,2489,2491,2493,2495,2497,2498,2500,2501,
	2504,2507,2509,2511,2512,2513,2515,2517,2518,2519,2523,2524,2525,2527,2528,2529,2533,2536,2537,2545,2547,2554,2558,2559,2560,2561,2563,2564,
	2566,2567,2569,2571,2572,2573,2575,2577,2578,2581,2582,2587,2588,2589,2592,2594,2597,2599,2601,2602,2603,2605,2606,2608,2611,2612,2614,2615,
	2619,2623,2624,2627,2629,2631,2636,2637,2638,2641,2642,2643,2644,2645,2648,2649,2651,2653,2654,2656,2661,2662,2669,2672,2673,2675,2681,2692,
	2696,2701,2704,2705,2708,2721,2722,2723,2725,2727,2732,2733,2734,2735,2738,2743,2744,2746,2747,2752,2757,2759,2761,2762,2763,2764,2768,2771,
	2773,2776,2779,2781,2783,2785,2787,2792,2798,2799,2804,2807,2811,2813,2815,2816,2817,2818,2823,2824,2825,2827,2831,2836,2839,2841,2845,2846,
	2848,2853,2854,2855,2858,2859,2863,2864,2866,2867,2869,2872,2873,2875,2876,2878,2881,2883,2885,2888,2889,2891,2893,2894,2896,2899,2901,2902,
	2906,2908,2911,2913,2916,2918,2921,2923,2929,2931,2932,2933,2935,2936,2941,2942,2943,2944,2947,2949,2951,2956,2959,2962,2965,2966,2972,2973,
	2974,2977,2978,2979,2981,2983,2984,2986,2987,2989,2991,2993,2995,2997,2998,-1 //-1 mark
};//1375个 

#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))


int main()
{
	//freopen("out.txt","w",stdout);
	int i,num=0;
	cin>>num;
	while(1)
	{
		for(i=0;i<1375;i++)
		if(alpme[i]>num)
		{
			cout<<i;
			return 0;
		}	
		if(alpme[i]==-1)break;
	}
	cout<<"1375";
	return 0;
}

结果:AC 0K 62ms 6912B  ,打表是为了显得好看,实际上表是不会直接这么打出来的

然后这么一步一步一步的下来,

如下的解题代码就出现了,看吧,其实一串长长的代码也没有那么高大上,一步一步头脑清晰的话,就出的来了~:

#include <cmath> 
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int alpme[1376];

const int prime[]=
{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,
127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,
283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,
467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,
661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,
877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,
1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,
1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,
1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499    };

#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))

bool is_alpme(int i)
{
	bool flag=false;
	int pos=0,nbr=i;
	while(1)
	{
		if(prime[pos]>nbr)return false;
		if(flag==false && nbr%prime[pos]==0)
		{
			flag=true;
			while(nbr%prime[pos]==0)nbr=nbr/prime[pos];
		}
		else if(flag==true && nbr%prime[pos]==0)
		{
			nbr=nbr/prime[pos];
			while(nbr%prime[pos]==0)nbr=nbr/prime[pos];
			if(nbr==1)return true;
			else return false;
		}
		if(prime[pos]==1499)return false;
		pos++;
	}
}

void alpme_init()
{
	int pos=0;
	for(int i=1;i<=3000;i++)
	{
		if(is_alpme(i))alpme[pos++]=i;	
	}
	alpme[pos]=-1;	
}

int main()
{
	memset(alpme,0,sizeof(alpme));
	int i,num=0;
	cin>>num;
	alpme_init();
	while(1)
	{
		for(i=0;i<1375;i++)
		if(alpme[i]>num)
		{
			cout<<i;
			return 0;
		}	
		if(alpme[i]==-1)break;
	}
	cout<<"1375";
	return 0;
}

RunID User Problem Result Memory Time Language Length Submit Time
2298520okcd00FAccepted0 KB92 msGNU C++ 4.62076 B2014-06-04 20:27:53
2298488okcd00FAccepted0 KB62 msGNU C++ 4.66912 B2014-06-04 20:19:10
2298475okcd00FTime limit exceeded on test 15

GNU C++ 4.66865 B2014-06-04 20:15:33
2298402okcd00FAccepted0 KB62 msGNU C++ 4.613871 B2014-06-04 19:56:03
2298399okcd00FCompilation error

GNU C++ 4.613871 B2014-06-04 19:55:32
2298342okcd00FAccepted0 KB62 msGNU C++ 4.61931 B2014-06-04 19:42:33

我只是想做一个打表题的流程解说……结果……这不是打脸么Q^Q 居然时间还长了……(其实因为这道题n=3000时有效中间数据有1375个略多所以才显示不出方法的高大上)

咳咳,大家理会一下个中深意,学会这种方法就好,不要纠结于这一道题上,恩恩,捂脸逃跑~


——————————————————————————————————————————————-


【Update 2016/01/18】

# When Who Problem Lang Verdict Time Memory
15426097 2016-01-18 14:33:05 Royalmiki A - Almost Prime GNU C++11 Accepted 30 ms 0 KB

啊之前慢是有原因的……是因为这一段的O(n)导致的

for(i=0;i<1375;i++)
if(alpme[i]>num)
{
	cout<<i;
	return 0;
}	
if(alpme[i]==-1)break;

改写如下:

#include <cmath>   
#include <cctype>  
#include <cstdio>  
#include <string>  
#include <cstdlib>  
#include <cstring>  
#include <iostream>  
#include <algorithm>  
using namespace std;  
  
int alpme[1376];  
  
const int prime[]=  
{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,  
127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,  
283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,  
467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,  
661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,  
877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,  
1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,  
1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,  
1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499    };  
  
#define Max(a,b) ((a)>(b)?(a):(b))  
#define Min(a,b) ((a)<(b)?(a):(b))  
  
bool is_alpme(int i)  
{  
    bool flag=false;  
    int pos=0,nbr=i;  
    while(1)  
    {  
        if(prime[pos]>nbr)return false;  
        if(flag==false && nbr%prime[pos]==0)  
        {  
            flag=true;  
            while(nbr%prime[pos]==0)nbr=nbr/prime[pos];  
        }  
        else if(flag==true && nbr%prime[pos]==0)  
        {  
            nbr=nbr/prime[pos];  
            while(nbr%prime[pos]==0)nbr=nbr/prime[pos];  
            if(nbr==1)return true;  
            else return false;  
        }  
        if(prime[pos]==1499)return false;  
        pos++;  
    }  
}  
  
void alpme_init()  
{  
    int pos=0;  
    for(int i=1;i<=3000;i++)  
        if(is_alpme(i))alpme[pos++]=i;    
    alpme[pos]=-1;    
}  
  
int main()  
{  
    memset(alpme,0,sizeof(alpme));  
    int i,num=0; cin>>num;  
    alpme_init();  
	int pos = upper_bound(alpme,alpme+1375,num)-alpme;
	//cout<<pos<<":"<<alpme[pos]<<endl;	
	if(pos == 1375) cout<<"1375"<<endl;  
	else cout<<pos<<endl;
	return 0;
}  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果天王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值