趣味算法------可截断素数


目录

题目描述:

思路解析:

质数判断函数:

反转函数:

右截断素数判断函数:

左可截断素数:

具体代码:


题目描述:


左截断素数是不包含 0 位的素数,当连续删除第一个数字时,结果始终为素数。

可右截断的素数是不包含 0 位的素数,当连续删除最后一位时,结果始终为素数。

创建一个将整数作为参数的函数,并且:

如果整数只是一个可左截断的素数,则返回 "left"。
如果整数只是一个可右截断的素数,则返回 "right"。
如果整数是两者,则返回 "both"。
否则,返回 False。

输入输出格式
输入格式
输入一个整数;
输出格式
输出一个字符串,表示输入整数的素数类型。

输入输出样例1
输入
9137
输出
left
解释(可选)
因为9137 137 37 7都是质数。

输入输出样例2
输入
5939
输出
right
解释(可选)
因为5939 593 59和5都是素数。


思路解析:

        轻松的做法是一个功能定义一个函数,根据题干一个功能对应一个函数。

质数判断函数:

int check(int n)

{

    if (n < 2)

        return 0;

    else

        if (n == 2 || n == 3)

            return 1;

        else

            if (n % 6 != 1 && n % 6 != 5)

                return 0;

            else

            {

                int i = 5;

                while (i * i <= n)

                {

                    if (n % i == 0 || n % (i + 2) == 0)

                        return 0;

                    i += 6;

                }

            }

    return 1;

}

        这是一种快速判断一个数字是不是质数的函数,第一次使用是在如下文章:

循环结构------素数和_循环结构素数-CSDN博客

反转函数:

int turn(int n)
{
    int count = 0;
    while (n)
    {
        count = count * 10 + n % 10;
        n /= 10;
    }

    return count;
}//用于反转一个整数,例如123反转成321。

右截断素数判断函数:

int right(int n)
{
    while (n)
    {
        if (check(n))
            n /= 10;//每次进行一次质数判断便在右边截去一位。
        else
            return 0;
    }

    return 1;
}

左可截断素数判断函数:

​
int left(int n)
{
	while (n)
	{
		if (check(n))
		{
			n=turn(n);
			n /= 10;
			n=turn(n);
		}
		else
			return 0;
	}

	return 1;
}

​

      因为我们这次要截去数字的最高位,所以我们要将数字反转一次,截取反转后的最左边数字,然后再次反转数字,循环往复就能达到截取最高位的效果。


具体代码:

#include<stdio.h>
int check(int n)
{
	if (n < 2)
		return 0;
	else
		if (n == 2 || n == 3)
			return 1;
		else
			if (n % 6 != 1 && n % 6 != 5)
				return 0;
			else
			{
				int i = 5;
				while (i * i <= n)
				{
					if (n % i == 0 || n % (i + 2) == 0)
						return 0;
					i += 6;
				}
			}
	return 1;
}
int turn(int n)
{
	int count = 0;
	while (n)
	{
		count = count * 10 + n % 10;
		n /= 10;
	}

	return count;
}
int right(int n)
{
	while (n)
	{
		if (check(n))
			n /= 10;
		else
			return 0;
	}

	return 1;
}
int left(int n)
{
	while (n)
	{
		if (check(n))
		{
			n=turn(n);
			n /= 10;
			n=turn(n);
		}
		else
			return 0;
	}

	return 1;
}
int main(void)
{
	int n;
	scanf("%d", &n);

	int right_flag = right(n);
	int left_flag = left(n);

	if (right_flag && left_flag)
		printf("both");
	else if (right_flag)
		printf("right");
	else if (left_flag)
		printf("left");
	else
		printf("False");
}

        如此就完成了这道题目。

备注:

        以这种方式来完成这道题实际上运行的时候多了很多步骤,但是这样写能很容易让基础差点的同学快速领会,更重要的是在趣味算法篇章中,我更想用轻松有意思易看懂的方法来讲述和解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值