XTU-循环3-素数

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;
}

小技巧

  1. 及时退出:一旦发现X有一个大于1的因子,立即返回0(假),只有最后才返回1(真)。
  2. 函数名的选取是有章可循的,“is_prime"取自英文"is it a prime?”
  3. 建议把谓词(用来判断某事物是否具有某种特性的函数)命名成“is_xxx”的形式,返回int值,非0表示真,0表示假。
  4. i*i可能会溢出!
  5. 编写函数时应尽量保证该函数能对任何合法参数得到正确的结果。如若不然,应在显著位置标明函数的缺陷,以避免误用。

改进后的函数

#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 的最大整数值。

感悟

  1. 卡了好几天,交了很多遍,各种错误都有了,自认为此程序很简单,然而,读图读题读题!!!然后经过大佬指点,,,我。。。。。。。。。。。。
    XTU-循环3-素数_第1张图片

你可能感兴趣的:(XTU-循环3-素数)