题解 | #素数回文#

素数回文

http://www.nowcoder.com/practice/d638855898fb4d22bc0ae9314fed956f

#include <stdio.h>
#include <math.h>

long long hw(long long t)
//定义一个函数用于求一个数的回文数
{
	int a = 0;
	long long b = t;

	for (; b != 0;)
	{
		b /= 10;
		a++;
	}
	//先求出要求回文数的值的单位个数
	long long d = t;

	for (; a > 1;a--)
	{
		d =(d*10 + t / 10 % 10);
		t /= 10;
	}
	//根据要求回文数的值的单位个数来计算他的回文数,如果是两位数,它的回文数就是自己*10再加上
	//自己除10然后取余10的值,两位数以上,多一位就再循环一次

	return d;
}

int su(long long t)
//定义一个函数用来判断素数
{
	long long a;
	int b = 0;

	if (t % 2 == 0)
	{
		return 0;
	}

	long double c = sqrt(t);

	for (a = 3; a < c; a+=2)
	{
		if ((t % a) == 0)
		{
			b++;
			break;
		}
	}
	//这个判断是抄别人的,我也没看懂emmm

	if (b == 0)
	{
		return 1;
	}
	//是素数,返回1
	else
	{
		return 0;
	}
	//不是素数,返回0
}

int main()
{
	long long t;
	//定义一个变量t作为输入的数值
	scanf("%lld", &t);

	t = hw(t);
	//调用函数求出t的回文数
	t = su(t);
	//调用函数判断t是否为素数

	if (t == 1)
	{
		printf("prime");
	}
	//如果函数返回的值为1,1为真,是素数,则打印prime
	else if (t == 0)
	{
		printf("noprime");
	}
	//如果函数返回的值为0,0为假,不是素数,则打印noprime

	return 0;
}
全部评论
简单说一个数如果不是质数一定能拆解成a与b的乘积,其中必有一个大于等于原数开根号,另一个小于原数开根号,于是只需要找小于等于根号的因子就可以了,运算会简便很多.
1 回复 分享
发布于 10-13 19:25 江苏
我问了gpt它是这样答的: 在素数判断函数中,使用sqrt(n)函数是因为素数的最小因子肯定不会超过其平方根。所以只需要检查从2到sqrt(n)的所有数是否能整除n,如果存在能整除n的数,那么n就不是素数,否则就是素数。 当i超过sqrt(n)时,即i > sqrt(n),那么i * (n / i)肯定大于n,因为n / i会小于sqrt(n),这样在i > sqrt(n)时,不会再有整除n的情况,所以不需要继续循环。 这也是为什么在素数判断函数中,循环条件可以设为i <= sqrt(n)的原因。因为只需要检查到sqrt(n)就足够了,超过sqrt(n)的部分在之前已经被检查过了。 所以使用sqrt(n)函数可以提高算法效率,避免不必要的循环。
点赞 回复 分享
发布于 03-26 22:53 德国

相关推荐

11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
9
收藏
分享
牛客网
牛客企业服务