牛客网模拟(第一场)超级素数

思路:暴力枚举幂q,然后n开q次幂之后检查一下是否相等和p是否是素数。


/*****************************牛客统测**********************************
 *                             超级素数
 *							XSH/2017/3/12
 *题目描述
 *如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就
 *称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要
 *找出对应的p,q。 
 *
 *输入描述 :
 *输入一个正整数n(2 ≤ n ≤ 10 ^ 18)
 *
 *输出描述 :
 *如果n是一个超级素数幂则输出p, q, 以空格分隔, 行末无空格。
 *如果n不是超级素数幂,则输出No
 *
 *输入例子:
 *27
 *
 *输出例子 :
 *3 3
************************************************************************/
bool isPrime(long long n)
{
	long long tmp = sqrt(n);
	for (long long i = 2; i <= tmp; ++i)
	if (0 == n%i) return false;
	return true;
}

long long isPower(long long m, int n)
{
	return (0 == n) ? 1 : isPower(m, n - 1)*m;
}

void isSuper(long long n)
{
	//方法一:
	bool flag = true;
	for (long long i = 2;; ++i)
	{
		double tmp = pow(n, 1.0 / i);
		if (tmp < 2.0) break;
		if (isPrime((long long)(tmp + 0.1)) && n == isPower(tmp + 0.1, i))
		{
			flag = false;
			cout << (int)(tmp + 0.1) << " " << i << endl;
		}
	}
	if (flag) cout << "No" << endl;

	//方法二:
	//时间复杂度O(log2(N) * sqrt(sqrt(N))),也就是 以2为底N的对数 乘以 N的4分之1次方
	//N = p的q次方,显然p最小时q最大,因为最小的素数是2,所以q的上限也就是log2N即log10(n) / log10(2)
	/*int p, q;
	int up = log10(n) / log10(2);
	for (q = 2; q <= up; q++)
	{
		p = pow(n, 1.0 / q);
		//判断p的q次方是否为n且p为素数      
		if (pow(p, q) == n && isPrime(p))
		{
			cout << p << " " << q << endl;;
			break;
		}
	}
	if (q > up)
		cout << "No" << endl;*/
}

int main()
{
	long long N;

	while (cin >> N)
		isSuper(N);

	system("pause");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值