版权声明:转自可爱的安安的博客!qq:1085589289 https://blog.csdn.net/ac1085589289/article/details/83862759
Description
对于大于1的自然数,如果n为素数,那么所有大于1且不大于n的平方根的自然数都不能整除n,反之亦然。所以我们可以通过测试来确定n是否为素数。现在给出n,要你求是否为素数,是输出Yes,否则输出No
每行一个正整数n,n<=2^32-1,如果n为0,则输入结束。判断n是否为素数
每行输出一个用例的结果,如果是输出"Yes",否则输出“No”
Sample Input
2
3
4
5
6
0
Sample Output
Yes
Yes
No
Yes
No
Source
ericxie
函数(有问题)
//n=1或者n太大时请勿调用
int is_prime(int n)
{
for(int i=2;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
小技巧
- 及时退出:一旦发现X有一个大于1的因子,立即返回0(假),只有最后才返回1(真)。
- 函数名的选取是有章可循的,“is_prime"取自英文"is it a prime?”
- 建议把谓词(用来判断某事物是否具有某种特性的函数)命名成“is_xxx”的形式,返回int值,非0表示真,0表示假。
- i*i可能会溢出!
- 编写函数时应尽量保证该函数能对任何合法参数得到正确的结果。如若不然,应在显著位置标明函数的缺陷,以避免误用。
改进后的函数
#include<stdio.h>
#include<math.h>
int is_prime(unsigned n);
int main()
{
unsigned int n;
while(scanf("%d",&n)==1&&n)
{
if(is_prime(n)==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
int is_prime(unsigned int n)
{
if(n<=1) return 0;
unsigned int m=floor(sqrt(n)+0.5);
unsigned int i;
for(i=2;i<=m;i++)
if(n%i==0) return 0;
return 1;
}
提示
易错
1.注意是unsigned int!!!!卡了几天了过不去好伐,极度打击人家的积极性好伐,什么方法都用过了好伐
C 库函数 - floor()
描述
C 库函数 double floor(double x) 返回小于或等于 x 的最大的整数值。
声明
double floor(double x)
参数
x – 浮点值。
返回值
该函数返回不大于 x 的最大整数值。
感悟
- 卡了好几天,交了很多遍,各种错误都有了,自认为此程序很简单,然而,读图读题读题!!!然后经过大佬指点,,,我。。。。。。。。。。。。