欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 趣味算法------可截断素数

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

2025/6/23 14:20:41 来源:https://blog.csdn.net/markingyi/article/details/141198645  浏览:    关键词:趣味算法------可截断素数


目录

题目描述:

思路解析:

质数判断函数:

反转函数:

右截断素数判断函数:

左可截断素数:

具体代码:


题目描述:


左截断素数是不包含 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;elseif (n == 2 || n == 3)return 1;elseif (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;//每次进行一次质数判断便在右边截去一位。elsereturn 0;}return 1;
}

左可截断素数判断函数:

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

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


具体代码:

#include<stdio.h>
int check(int n)
{if (n < 2)return 0;elseif (n == 2 || n == 3)return 1;elseif (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;elsereturn 0;}return 1;
}
int left(int n)
{while (n){if (check(n)){n=turn(n);n /= 10;n=turn(n);}elsereturn 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");elseprintf("False");
}

        如此就完成了这道题目。

备注:

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词