3821. An Industrial Spy

  TOJ第二题:http://acm.tju.edu.cn/toj/showp3821.html

  两天没有写东西了,这两天比较纠结,发现什么都忘了。难道寒假就是个悲剧?

  这个题是一个简单题。给一个字符串,求排列是素数的个数。不说了,贴代码:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
const int MAX_SIZE = 10000000;
int num[MAX_SIZE + 1];
int value[5000];
void prime_num(int range){
	for (int i = 0; i <= MAX_SIZE; i++)
		num[i] = 0;
	if (range <= 10){ 
		num[4] = 1; 
		num[6] = 1; 
		num[8] = 1;
		num[9] = 1; 
		num[10] = 1; 
	}else { 
		int n = sqrt(range * 1.0);
		int k;
		prime_num(n); 
		for (int i = 2; i < n; i++){ 
			if (num[i] == 0){ 
				for (k = 2; k <= range / i; k++){
					num[k * i] = 1; 
				}
			}
		}
	}
}
int main()
{
	int tot, n[10], sum, k[10], t, p;
	prime_num(MAX_SIZE);
	cin>>tot;
	while (tot--)
	{
		string s;
		cin>>s;
		p = 0;
		int len = s.length();
		for (int i = 0; i < len; i++)
			n[i] = s[i] - '0';
		for (int i = 0; i < (1<<len); i++)
		{
			t = 0;
			for (int j = 0; j < len; j++)
				if (i & (1<<j))
					k[t++] = n[j];
			sort(k, k + t);
			do
			{
				int m = 0, l = 1;
				for (int i = 0; i < t; i++)
				{
					m += l * k[i];
					l *= 10;
				}
				if (m >= 2 && !num[m])
					value[p++] = m;
			} while (next_permutation(k, k + t));
		}
		sum = 0;
		sort(value, value + p);
		for (int i = 0; i < p - 1; i++)
			if (value[i] != value[i + 1])
				sum++;
		if (p)sum++;
		cout<<sum<<endl;
	}
	return 0;
}
posted @ 2011-02-23 22:35  like@neu  阅读(290)  评论(0编辑  收藏  举报