原题链接:蓝桥杯算法提高VIP-特殊的质数肋骨
解题思路:
符合该种质数的一位的质数为2, 3, 5, 7;而两位的质数为2x, 3x, 5x, 7x....
可以发现多一位位数即在前面是质数的基础上 * 10 再 加上 一个数,这个数很明显不能是偶数,因为除2外所有的偶数都不是质数。
所以我们就可以得到一个递推的式子: m = x * 10 + i,如果是质数则进入下一次:n = m * 10 + i;使用地推时需要注意的是出口,此时出口很明显是满足到要求的数字位数时即停止,同时输出该位数的数字,即可得结果。
注意事项:
使用递推时要注意出口。
参考代码:
//1544: 质数肋骨 #include <stdio.h> #include <math.h> int count = 0; //判断是否为质数 int judge( int n ) { int i, j; for( i = 2 ; i <= sqrt(n) ; i ++ ) { if( n % i == 0) return 0; } return n; } //判断是否达到要求的位数 //n 是第一位的数字,c 是位数 int a10(int n, int c) { int i, num; // 在最后一次时,多执行了一次count--,所以选择将count+1或c-1 if( count == c - 1 ) { printf("%d\n", n); return 0; } for( i = 1; i < 10 ; i++ ) { num = n * 10 + i; if( judge(num) != 0 ) { count ++; a10(num, c); count --; } } } int main() { int n, i = 0, j, num = 1, end, ans[8], flag = 0, t; scanf("%d", &n); // 1位数的质数2, 3, 5, 7. // 所以输出必定以这4位数字开头,即最高位。 a10(2, n); a10(3, n); a10(5, n); a10(7, n); return 0; }
0.0分
8 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复