【C语言】素数以及其衍生出的一系列题目

目录

前序 

储备知识

 一:素数(入门)

 判断一个数是否为素数

输入描述

输出描述

样例输入

 样例输出

源代码

 二:素数以及逆序的综合利用(基础)

1.绝对素数

题目描述

输入

输出

 源代码

 2.素数回文数

提示

题目描述

输入

输出

源代码

三:素数和数组的综合利用(进阶) 

1.歌德巴赫猜想

题目描述

输入

输出

样例输入 

样例输出 

 源代码

2.素数对

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

 源代码

结尾


前序 

这里我们主要讲关于素数的一系列题目,有入门也有进阶的题目,题目难度是循序渐进的,只要一步步看懂,我相信做会这些题目并不需要多少时间

储备知识

首先我们先理解一下素数的概念

素数(或质数)是指一个大于1的自然数n,在2~n-1或者2~根号n的范围内不能被整除的数

在这里特别强调一下1不是素数

 一:素数(入门)

 判断一个数是否为素数

输入描述

一个大于1且小于100000000的整数m。

输出描述
  1. 如果m不在规定的数值范围(大于1且小于100000000)之内,则输出“input error!”;

  2. 如果m是素数,输出“prime”,否则请输出“not prime”。

样例输入
10000019
 样例输出
prime
源代码
#include<stdio.h>
#include<math.h>
int main()
{
	unsigned long x,y;
	double z;
	y=2;
	scanf("%lu",&x);
	z=sqrt(x);
//根据定义来判断这个数是否为素数
	while(y <= z)
	{
		if(x%y==0)	
		{
		printf("not prime");
		break;
		}
		else 
			y++;
	}
//若没有跳出循环,则这个数为素数
	if(y>z)
	printf("prime");
   return 0;
}

 二:素数以及逆序的综合利用(基础)

1.绝对素数

题目描述

如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13,试编程求出所有两位数中的绝对素数。

输入

输出

若干行,每行一个绝对素数,从小到大输出

 源代码
#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,k,l,m;
    for(i=10;i<=99;i++)
    {
//判断一个数是否为素数
        k=sqrt(i);
        for(j=2;j<=k;j++)
        {
            if(i%j==0)
            {
                break;
            }
        }
//若这个数没有跳出循环,证明这个数是素数
        if(j>k)
        {
//接下来这一步相当于把这个两位数逆序
            l=i%10*10+i/10;
//再一次判断这个逆序了的数是否为素数
             for(m=2;m<=sqrt(l);m++)
           {
            if(l%m==0)
            {
                break;
            }
            }
            if(m>sqrt(l))
            {
                printf("%d\n",i);
            }
        }
    }
}

 2.素数回文数

提示

这个题目和上面一个题目其主要步骤是差不多的,都是判断是否为素数以及逆序这个数,只不过这个题稍微难一点点

题目描述

如果一个数从左边读和右边读都是同一个数,就称为回文数,例如686就是一个回文数。编程求10到1000内所有的既是回文数同时又是素数的自然数。

输入

输出

若干个数 每行一个

源代码
#include<stdio.h>
#include<math.h>
int main()
{
    int i,k,j;
    int b,c;
    for(i=10;i<=1000;i++)
    {
        k=sqrt(i);
        for(j=2;j<=k;j++)
        {
            if(i%j==0)
            {
                break;
            }
        }
        if(j>k)
        {
			b=i;
       		c=0;
//以上都和前面的题目操作不能说相似,只能说一模一样!!!
//这个题目的不同之处在于下面4行
       		while(b>0)
       		 {
//这里很巧妙,将每次的末数*10,从而达到将这个数一步一步向前推的效果
   			c=c*10+b%10;
//每次除以10,减少一位,方便一步一步取余
        	b=b/10;
			}
   		 }
//若这个数逆序和正序一样,那这个数就是回文数
   		if(c==i)
		{
		printf("%d\n",i);
		}
    }
}

 二和三都是差不多的做法,而下面的四和五是差别挺大

三:素数和数组的综合利用(进阶) 

1.歌德巴赫猜想

题目描述

任一个大于等于4的偶数都可以拆分为两个素数之和。

输入

一个整数n( 4 <= n <= 200 )

输出

将小于等于n的偶数拆分为2个质数之和,列出所有方案!

样例输入 
10
样例输出 
4=2+2
6=3+3
8=3+5
10=3+7
10=5+5
 源代码
#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
//采用数组储存素数,会更方便
    int arr[n];
    int a=0;
    int j;
    for(int i=2;i<=n;i++)
    {
        int k=sqrt(i);
        for(j=2;j<=k;j++)
        {
            if(i%j==0)
            {
                break;
            }
        }
        if(j>k)
        {
//这里注意一点要自加,不然数组不移动
            arr[a++]=i;
        }
    }
    int l;
    for(l=1;l<=n;l++)
    {
//根据题目要求,先判断其是否为偶数
    	if(l%2==0)
    	{
//用二重循环,判断是否满足条件
   			 for(int i=0;i<a;i++)
   			 {
       			 for(int k=0;k<a;k++)
        			{
//注意除了相加要等于偶数以外,一定要多后面的判断,不然会出现,重复的情况
            			if(arr[i]+arr[k]==l&&arr[i]<=arr[k])
            			{
                			printf("%d=%d+%d\n",l,arr[i],arr[k]);
           				 }
        			}			
   			 }
		}
	}
}

2.素数对

孪生素数是指间隔为2的两个相邻素数,因为它们之间的距离已经近得不能再近了,如同孪生兄弟一样,故将这一对素数称为孪生素数。
例如(3,5),(5,7),(11,13)等

输入格式:

在一行输入2个正整数m和n 求两个数之间的所有孪生素数

输出格式:

若该区间有:则输出形如(3,5)素数对,一行输出一对,在最后一行统计输出共有几对孪生素数
若区间没有:输出“没有找到”

输入样例1:
2 20
输出样例1:
(3,5)
(5,7)
(11,13)
(17,19)
共找到4对孪生素数
输入样例2:
18  25
输出样例2:
没有找到
 源代码

#include<stdio.h>
#include<math.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
//注意输入两个数的大小,题目并没有给出,所以一定要判断哪个数更大
    int max,min;
    max=m>n?m:n;
    min=m<n?m:n;
    int arr[max];
    int i,j,k;
    int a,c;
    a=0;c=0;
    for(i=min;i<=max;i++)
    {
    k=sqrt(i);
        for(j=2;j<=k;j++)
        {
            if(i%j==0)
            {
                break;
            }
        }
        if(j>k)
        {
            arr[a++]=i;
        }
    }
//上面内容都跟上一题一模一样
//不同点在下面
    for(i=0;i<a-1;i++)
    {
//判断后面一个数是否比前面一个数大2
        if(arr[i+1]==arr[i]+2)
        {
            printf("(%d,%d)\n",arr[i],arr[i+1]);
            c++;
        }
    }
//判断c的值从而判断是否存在素数对
    if(c>0)
    printf("共找到%d对孪生素数",c);
    else if(c==0)
    printf("没有找到");
}

结尾

以上则是文章所有内容,希望能对你有所帮助,记得坚持做题!!!

  • 19
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 一个简单的素数代码可以编写如下:#include <stdio.h> int main() { int n; printf("输入一个数字:"); scanf("%d", &n); int i; int isPrime = 1; for(i=2; i<=n/2; i++) { // 如果n可以被i整除 if(n%i==0) { isPrime = 0; break; } } if (isPrime==1) printf("%d 是素数", n); else printf("%d 不是素数", n); return 0; } ### 回答2: 以下是使用C语言编写的一个实现一百以内素数的代码: ```c #include <stdio.h> int isPrime(int num) { if (num < 2) { return 0; } for (int i = 2; i <= num / 2; i++) { if (num % i == 0) { return 0; } } return 1; } int main() { printf("一百以内的素数有:\n"); for (int i = 2; i < 100; i++) { if (isPrime(i)) { printf("%d ", i); } } printf("\n"); return 0; } ``` 这个代码中,我们定义了一个`isPrime`函数来判断一个数字是否为素数。在`isPrime`函数中,我们首先判断数字小于2的情况,因为小于2的数字不是素数,返回0;然后我们用一个循环从2开始到`num`的一半,依次判断`num`是否能被这些数整除,如果能整除则说明不是素数,返回0,否则返回1。 在`main`函数中,我们从2开始遍历到99,对每个数字调用`isPrime`函数判断是否为素数,如果是,则打印该数字。最后输一百以内的所有素数。 希望对您有帮助! ### 回答3: 要用C语言编写一个输一百以内的素数的代码,可以按照以下步骤进行: 1. 声明一个函数`isPrime()`,该函数用于判断一个数是否是素数。函数的输入参数为一个整数`num`,返回值为`int`类型。 2. 在`isPrime()`函数内部,使用一个循环从2开始遍历到`num`的平方根(用`sqrt()`函数进行计算),如果存在可以整除`num`的数,则`num`不是素数,返回0。 3. 如果循环结束后仍然没有找到可以整除`num`的数,则`num`是素数,返回1。 4. 在主函数中,使用一个循环从2开始遍历到100,对每个数调用`isPrime()`函数进行判断。 5. 如果`isPrime()`函数返回值为1,则输素数。 下面是代码示例: ```c #include <stdio.h> #include <math.h> int isPrime(int num) { int i; for (i = 2; i <= sqrt(num); i++) { if (num % i == 0) { return 0; // 不是素数 } } return 1; // 是素数 } int main() { int i; for (i = 2; i <= 100; i++) { if (isPrime(i)) { printf("%d ", i); } } return 0; } ``` 以上代码会输所有在一百以内的素数,即:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值