C语言程序设计100例之(11):求质数
例11 求质数
问题描述
质数是指除了有1和自身作为约数外,不再有其他约数的数。比如:3、5、7是质数。而9不是质数,因为它还有约数3。
编写程序求给定区间中的所有质数。
输入格式
两个整数a和b,其中1≤a≤b≤100000。
输出格式
输出给定范围的所有质数,输出时每个质数占5列,每行输出10个质数。
输入样例
100 200
输出样例
101 103 107 109 113 127 131 137 139 149
151 157 163 167 173 179 181 191 193 197
199
(1)编程思路
判断一个数m是否为质数的方法是:用2~sqrt(m)中的每一个整数i去除m,若某一个i能整除m,则m不是质数;否则,m是质数。该操作可定义为一个函数,如下:
int isPrime(int m)
{
int i;
if (m==1) return 0;
for (i=2;i<=sqrt(1.0*m);i++)
if (m%i==0) return 0;
return 1;
}
求a~b之间的所有质数,写成一个循环,在循环中调用函数isPrime判断每个整数i是否为质数,若是,则计数并输出。
(2)源程序。
#include <stdio.h>
#include <math.h>
int isPrime(int m)
{
int i;
if (m==1) return 0;
for (i=2;i<=sqrt(1.0*m);i++)
if (m%i==0) return 0;
return 1;
}
int main()
{
int i,a,b,cnt=0;
scanf("%d%d",&a,&b);
for (i=a;i<=b;i++)
{
if (isPrime(i))
{
cnt++;
printf("%5d",i);
if (cnt%10==0) printf("\n");
}
}
return 0;
}
习题11
11-1 回文质数
问题描述
我国古代有一种回文诗,倒念顺念都有意思,例如“人过大佛寺”,倒读起来便是“寺佛大过人”。还有经典的对联“客上天然居,居然天上客”等。在自然数中,如果一个数从左向右读或是从右向左读完全一致,这样的自然数称为回文数。
编写一个程序,找出N之内的所有回文质数。所谓回文质数就是一个数即是一个质数又是一个回文数,例如,151 是回文质数。
输入格式
一个整数N,其中1≤N≤100000。
输出格式
输出N以内的所有回文质数,输出时每个回文质数占5列,每行输出10个回文质数。
输入样例
10000
输出样例
2 3 5 7 11 101 131 151 181 191
313 353 373 383 727 757 787 797 919 929
(1)编程思路。
将判断一个数是否为质数和是否为回文数分别写成一个函数。
函数int isPrime(int m);判断数m是否为质数,m是质数,函数返回值为1,否则为0。
函数int isPalm(int m); 判断数m是否为回文数,m是回文数,函数返回值为1,否则为0。
(2)源程序。
#include <stdio.h>
#include <math.h>
int isPrime(int m)
{
int i;
if (m==1) return 0;
for (i=2;i<=sqrt(1.0*m);i++)
if (m%i==0) return 0;
return 1;
}
int isPalm(int m) // 判断m是否为回文数
{
int a,b;
a=m; b=0;
while (a>0)
{
b=b*10+a%10 ;
a = a/10;
}
return b==m;
}
int main()
{
int i,n,cnt=0;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
if (isPalm(i) && isPrime(i))
{
cnt++;
printf("%5d",i);
if (cnt%10==0) printf("\n");
}
}
return 0;
}
从程序运行结果可以看出,回文质数除了11以外,所有回文质数的位数都是奇数。这是因为,如果一个回文数的位数是偶数,则它的奇数位上的数字之和与偶数位上的数字之和必然相等。根据数的整除性原理,这样的数肯定能被11整除。因此,回文质数的位数绝不可能是偶数(除11外)。
11-2 第N个质数
问题描述
质数就是不能再进行等分的整数。比如:7,11是质数。而9不是质数,因为它可以平分为3等份。一般认为最小的质数是2,接着是3,5,...
设“2” 是第一个质数,“3” 是第二个质数,依此类推。问第N个质数是多少?
输入格式
一个整数N,其中1≤N≤1000000。
输出格式
一个整数,它是第N个质数。
输入样例
10
输出样例
29
(1)编程思路。
先处理n=1,输出2的特殊情况。因为,2之后的所有质数均为奇数。
记当前质数个数cnt=1(2是第1个质数),从i=3开始,顺序判断当前奇数是否为质数,若是质数则cnt++,若cnt==n,则当前奇数为第n个质数,结束循环查找并输出结果。
(2)源程序。
#include <stdio.h>
#include <math.h>
int isPrime(int m)
{
int i;
if (m==1) return 0;
for (i=2;i<=sqrt(1.0*m);i++)
if (m%i==0) return 0;
return 1;
}
int main()
{
int n,i,cnt;
scanf("%d",&n);
if (n==1) printf("2\n");
else
{
cnt=1; i=3;
while(1)
{
if (isPrime(i)) cnt++;
if(cnt==n) break;
i+=2;
}
printf("%d\n",i);
}
return 0;
}
11-3 哥德巴赫猜想(升级版)
题目描述
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。
这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。
从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
现在请你编一个程序验证哥德巴赫猜想。
输入格式
仅有一行,包含一个正奇数n,其中9<n<20000。
输出格式
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。
输入样例
2009
输出样例
3 3 2003
(1)编程思路。
对输入的正奇数n,先判断其和是否含有质数2,只有一种可能2+2+(n-4),若n-4是质数,则直接输出结果,结束。
如果n的和值中不包含质数2,则只能分解为3个奇数之和。不妨设n=i+j+(n-i-j)。用一个二重循环寻找答案。外循环i为3~n/3之间的所有奇数,内循环j为i~n/3之间的所有奇数,在内循环中调用函数isPrime判断,若i、j、n-i-j三个数均为质数,则找到答案,输出并结束。
(2)源程序。
#include <stdio.h>
#include <math.h>
int isPrime(int m)
{
int k,i;
k=sqrt(1.0*m);
for (i=2;i<=k;i++)
if (m%i == 0) return 0;
return 1;
}
int main()
{
int n,i,j,flag=0;
scanf("%d",&n);
if (isPrime(n-4)==1)
{
printf("%d %d %d\n",2,2,n-4);
return 0;
}
for (i=3;i<=n/3;i+=2)
{
if (isPrime(i)==0) continue;
for (j=3;j<=n/3;j+=2)
if (isPrime(j) && isPrime(n-i-j))
{
flag=1; break;
}
if (flag==1) break;
}
printf("%d %d %d\n",i,j,n-i-j);
return 0;
}
C语言程序设计100例之(11):求质数的更多相关文章
- C语言程序设计100例之(12):Eratosthenes筛法求质数
例12 Eratosthenes筛法求质数 问题描述 Eratosthenes筛法的基本思想是:把某范围内的自然数从小到大依次排列好.宣布1不是质数,把它去掉:然后从余下的数中取出最小的数,宣布它 ...
- 黑马程序员——经典C语言程序设计100例
1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...
- C语言程序设计100例之(14):丑数
例14 丑数 问题描述 丑数是其质因子只可能是2,3或5的数.前10个丑数分别为1, 2, 3, 4, 5, 6, 8, 9, 10, 12.输入一个正整数n,求第n个丑数. 输入格式 每行为一个 ...
- C语言程序设计100例之(6):数字反转
例6 数字反转 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入格式 ...
- C语言程序设计100例之(17):百灯判亮
例17 百灯判亮 问题描述 有序号为1.2.3.….99.100的100盏灯从左至右排成一横行,且每盏灯各由一个拉线开关控制着,最初它们全呈关闭状态.有100个小朋友,第1位走过来把凡是序号为1的 ...
- C语言程序设计100例之(25):确定进制
例25 确定进制 问题描述 6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的.即 6(13)* 9(13)= 42(13),因为,在十三进制中,42 = 4 * 13 + ...
- C语言程序设计100例之(23):数列求和
例23 数列求和 问题描述 已知某数列前两项为2和3,其后继项根据前面最后两项的乘积,按下列规则生成: ① 若乘积为一位数,则该乘积即为数列的后继项: ② 若乘积为二位数,则该乘积的十位上的数字和个 ...
- C语言程序设计100例之(22):插入排序
例22 插入排序 问题描述 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素或记录的任意序列,重新排列成一个以关键字递增(或递减)排列的有序序列. 排序的方法有很多,简单插入排序就是一 ...
- C语言程序设计100例之(21):折半查找
例21 折半查找 问题描述 顺序查找是一种最简单和最基本的检索方法.其基本思想是:从检索表的一端(如表中第一个记录或最后一个记录)开始,逐个进行记录的关键字和给定值的比较.若某个记录的关键字和给定值 ...
随机推荐
- LeetCode-7.reverse-integer 【翻转字符串】【数学】
PS: 第一次写文章好累啊,没想到这么短的文章写完这么累,大家给我点反馈,多给我留言啊.
- TypeScript躬行记(1)——数据类型
TypeScript不仅支持JavaScript所包含的数据类型,还额外扩展了许多实用的数据类型,例如枚举.空值.任意值等. 一.JavaScript的数据类型 JavaScript的数据类型包括6种 ...
- Linux入侵痕迹检测方案【华为云技术分享】
背景说明 扫描是一切入侵的基础,通过扫描来发现目标主机是否为活动主机.操作系统是什么版本.开放了哪些服务等.扫描技术纷繁复杂,新的扫描技术也层出不穷,不可能穷举所有扫描技术,下面按入侵步骤对主机扫描. ...
- Java修炼——反射机制
反射机制常见的作用: 1) 动态的加载类.动态的获取类的信息(属性,方法,构造器) 2) 动态构造对象 3) 动态调用类和对象的任意方法.构造器 4) 动态调用和处理属性 5) 获取泛型信息 6) 处 ...
- Redis 命令执行过程(下)
在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据 ...
- HDU4918 Query on the subtree 点分治+树状数组
bobo has a tree, whose vertices are conveniently labeled by 1,2,…,n. At the very begining, the i-th ...
- HDU3191-How many paths are there(次短路的长度及其个数)
oooccc1 is a Software Engineer who has to ride to the work place every Monday through Friday. For a ...
- C++ 并发编程指南(收藏笔记)
git地址: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice https://github.com/forhappy/Cpl ...
- 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)
目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...
- 【简明翻译】Hibernate 5.4 Getting Started Guide 官方入门文档
前言 最近的精力主要集中在Hibernate上,在意识到Hibernate 5 的中文资料并不多的时候,我不得不把目光转向Hibernate的官方doc,学习之余简要翻一下入门文档. 原文地址:htt ...