c语言中如何判断一个数是否是质数

c语言中如何判断一个数是否是质数,第1张

判断一个数是否是质数在于看这个数字是否只能被1和它本身所整除的整数。但是有一个例外,1不属于质数。

c语言中的质数:

数学的概念中,素数就是只能被1和它本身所整除的整数。但是有一个例外,就是1不属于素数。所以你在输入一个整数并加以判断的时候就需要考虑这种情况了。如下即可:

while(scanf("%lu", &num) == 1 && num != 1)

1

这里用到了while循环来判断输入的数值并加以判断,如果输入格式正确的话会返回一个1并将输入的数值存入num这个变量中,然后再判断num的值是否为1。

在这里有一条很好用的规则用于素数的判断:测试的数只需要界于2到num的平方根之间的所有数,看它们是否可以整除num。如果可以整除,说明输入的数不是素数;反之,说明输入的数是素数。

到这里,就会有人说平方根怎么求,其实这个很好解决。你完全可以像下面这样描述判断条件:

for(div = 2; (div div) <= num;div++){

if(num % div == 0){

if((div div) != num){

printf("%lu is divisible by %lu and %lu\n", num, div, num / div);

}else {

printf("%lu is divisible by %lu\n", num, div);

在这里,在if条件语句里面还嵌套了一个if条件语句,用来判断两个约数是否是一样的,比如144,约数是12和12,这时候就只需要打印一个约数即可。

第二,我们怎样知道一个数数素数呢?

如果num是素数,程序流程永远也进不了if语句中。为了解决这个问题,可以在循环外设置一个变量为某一值,比方说1,在if语句中将这个变量重设为0。那么,循环完成后,可以检查该变量是否仍然是1。如果是,则从没进入过if语句,这个数是素数。我这里用int类型的变量isPrime来当作一个标志实现这个想法。

好了,结合上面的所有想法,我们开始写代码了:

#include<stdioh>

int main(void)

unsigned long num;// 要检查的数

unsigned long div;// 可能的约数

int isPrime;// 素数的标志,1代表是素数,0代表不是素数

printf("Please enter an integer for analysis ");

printf("Enter q to quit\n");

while(scanf("%lu", &num) == 1 && num != 1)

for(div = 2, isPrime = 1;(div div) <= num; div++){

if(num % div == 0){// 如果能被div整除

if((div div) != num){// 约数不相等

printf("%lu is divisible by %lu and %lu\n", num, div, num / div);

}else{// 约数相同

printf("%lu is divisible by %lu\n", num, div);

// 将isPrime设置为0,表示其不是一个素数

isPrime = 0;

if(isPrime == 1){

printf("%lu 是素数\n", num);

printf("Please enter another integer for analysis ");

printf("Enter q to quit\n");

printf("Bye\n");

return 0;

这里有一个关键就是,在for循环控制表达式中使用了逗号运算符,以针对每个新输入的数将isPrime初始化为1。

反素数(Emirp)是一种素数,当它的数字反过来后,仍然是一个素数。

这个定义排除了相关的回文素数。

最小的几个反素数为:13, 17, 31, 37, 71, 73, 79, 97, 107, 113, 149, 157

所有非纯位数的可交换素数都是反素数。

#include<iostreamh>

bool prime(int n)//判断是否为素数

{

int i;bool flag=true;

for(i=2;i<=n/2;i++)

if(n%i==0)flag=false;

if(flag==true||n==2)return 1;//是的话返回 true

return 0;//否则 flase

}

int fun(int n)//将合数分解,这里用了函数的递归调用

{

int i;

if(prime(n))

{cout<<n;return 0;}

for(i=2;i<n;i++)

{

if(n%i==0&&prime(i))

cout<<i<<'';

else continue;

break;

}

fun(n/i);

}

void main()

{

int n;

cout<<"请输入一个数字n:";

cin>>n;

if(prime(n))cout<<"此数为素数。"<<endl;

else {cout<<"此数为合数:"<<"n=";fun(n);cout<<endl;}

}

由积的个位3 ,来由只能是13或7×9。显然7×9在首位上太大了。

确定这个数是1X3、3X1。则有:

(103+X)(301+X) = 39483

解此一元二次方程得X = 2

123321 = 39483

或确定首尾数之后,对39483分解质因数也可

建议你从网上下个win-tc,

它的帮助程序中有例题

题目:判断101-200之间有多少个素数,并输出所有素数。

1程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,

则表明此数不是素数,反之是素数。

2程序源代码:

#include

"stdioh"

#include

"conioh"

#include

"mathh"

main()

{

int

m,i,k,h=0,leap=1;

printf("\n");

for(m=101;m<=200;m++)

{

k=sqrt(m+1);

for(i=2;i<=k;i++)

if(m%i==0)

{

leap=0;

break;

}

if(leap)

{

printf("%-4d",m);

h++;

if(h%10==0)

printf("\n");

}

leap=1;

}

printf("\nthe

total

is

%d",h);

getch();

}

解题思路应是首先将一个给定大于9的奇数的值翻转(因偶数必为2的倍数就不必测试了,小于10的奇素数反转后仍是自身,也不必测试了),若奇数原值和翻转后的值均为素数,则输出之。所以,应首先实现值翻转和判值是否为素数的这两个函数,然后再主函数中循环即可。示例的C语言代码如下:

#include <stdioh>

#include <stdlibh>

//翻转给定值

unsigned

int ReverseNumber( unsigned int num )

{

int i;

unsigned int val = 0;

for( i=0; num; i++ )

{

val = 10;

val += (num % 10);

num /= 10;

}

return val;

}

//判给定值是否为素数

int IsPrime( unsigned int num )

{

unsigned int factor;

if( num < 2 ) return 0;

for( factor=2; factor<=(num/2); factor++ )

{

if( num % factor == 0 ) return 0;

}

return 1;

}

#define MAX(a,b) ((a)>(b)(a):(b))

#define MIN(a,b) ((a)<(b)(a):(b))

#define MIN_VALUE 1

#define MAX_VALUE 100000

#define MAX_PER_LINE 5 //每行5个

int main( void )

{

unsigned int sv, ev, a, b, n, r, cnt = 0;

//以下代码保证用户的输入值在题目的规定条件内

do {

printf( "Please input start number: " );

scanf( "%d", &sv );

} while( (sv<MIN_VALUE) || (sv>MAX_VALUE) );

do {

printf( "Please input end number: " );

scanf( "%d", &ev );

} while( (ev<MIN_VALUE) || (ev>MAX_VALUE) );

a = MIN( sv, ev ); //较小值赋给a

b = MAX( sv, ev ); //较大值赋给b

//小于10的值直接忽略

for( n=MAX( a, 10); n<=b; )

{

r = ReverseNumber( n );

//若反序后的值与原值不等(注:反序后相等的素数叫对称素数)

if( n != r )

{

if( IsPrime( n ) && IsPrime( r ) ) //且两值均为素数

{

printf( "%d, " );

cnt++;

if( cnt % MAX_PER_LINE == 0 ) printf( "\n" ); //另起一行输出

}

}

if( n & 1 ) n += 2; //若 n 是奇数, 则每次递增步长为2

else n++; //若是偶数则加1变为奇数

}

printf( "\nCount: %d\n", cnt );

return 0;

}

偶数不是素数,所以只判断4位奇数;最高位是偶数的也不是所求之数,故跳过。然后判断是否为回文数,是的再判断是否为素数;是的话输出这个素数。提供以下参考代码:

//#include "stdafxh"//If the vc++60, with this line

#include "stdioh"

int main(void){

    int i,j,k,f=0;

    for(i=1001;i<10000;i+=2){//偶数不是素数,不参与

        if((i/1000&1)==0) i+=1000;//最高位是偶数的不是所求之数,跳过

        if(i/1000==i%10 && i/100%10==i/10%10){//是回文数的再判是否为素数

            for(j=3;(k=jj)<=i;j+=2)//判断素数

                if(i%j==0) break;

            if(k>i)printf("%d ",f=i);//输出回文素数

        }

    }

    printf(f  "\n" : "There is no such a prime number\n");

    return 0;

}

以上就是关于c语言中如何判断一个数是否是质数全部的内容,包括:c语言中如何判断一个数是否是质数、反质数是什么意思、用C++编写一个判断素数合数的程序,要求输入素数时显示出“此数是素数”,输入合数时给出该合数的分解式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9821858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存