输入一个整数
。保证
是偶数。
第一行输出一个整数
,代表满足条件的素数对中的较小者。
第二行输出一个整数
,代表满足条件的素数对中的较大者。
20
7 13
4
2 2
#include <stdio.h>
int is(int x) {
int i;
int sum = 0;
if (x == 2)return 1;
for (i = 2; i < x; i++) {
if (x % i == 0)return 0;
}
return 1;
}
int main() {
int a;
scanf("%d", &a);
int i;
if (a % 2 == 0) {
for (i = 0; ; i++) {
if (is(a / 2 + i) == 1 && is(a / 2 - i) == 1) {
printf("%d\n%d", a / 2 - i, a / 2 + i);
return 0;
}
}
} else {
for (i = 0; ; i++) {
if (is(a / 2 + 1 + i) == 1 && is(a / 2 - i) == 1) {
printf("%d\n%d", a / 2 - i, a / 2 + i + 1);
return 0;
}
}
}
} 从中间往两头查找即可。如20先判断10-10是否为素数,再判断9-11,8-12以此类推
#include <stdio.h>
// 提前生成小于1000的质数表,可减少时间复杂度
#define list_size 168
int prime_list[list_size]={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, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997};
int main()
{
int x;
scanf("%d",&x);
int a=0,b=1000;
for(int i=0;i<list_size;i++)
{
for(int j=i;j<list_size;j++)
{
int aa=prime_list[i];
int bb=prime_list[j];
if(aa+bb==x)
{
if(bb-aa<b-a)
{
b=bb;
a=aa;
}
}
}
}
printf("%d\n%d",a,b);
return 0;
} #include <stdio.h>
#include<math.h>
int zhishu(int x)
{
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
return 0;
}
return 1;
}
int main() {
int a, i,j,flag,cha,i1,j1;
scanf("%d",&a);
cha=a;
for(i=2;i<=a/2;i++)
{
for(j=2;j<a;j++)
{
if(zhishu(i) && zhishu(j) && (i+j)==a)
{
if(cha>(j-i))
{
i1=i;
j1=j;
cha=j-i;
}
}
}
}
printf("%d\n%d",i1,j1);
return 0;
} #include <stdio.h>
int isStone(int value)
{
for(int i=2;i<value;i++){
if(value % i == 0){
return -1;
}
}
return 0;
}
int findStone(int *arr,int len, int value)
{
for(int i=0;i<len;i++){
if(value == arr[i]){
return 0;
}
}
return 1;
}
int main() {
int n;
int arr[1000];
int len = 0;
scanf("%d", &n);
for(int i=2;i<n;i++){
if(isStone(i) == 0){
arr[len++] = i;
}
}
int minA =0;
int minB =0;
unsigned int min = -1;
for(int i=0;i<len;i++){
int a = arr[i];
int b = n - arr[i];
if(findStone(arr, len, b) != 0){
continue;
}
int temp = a > b?a-b:b-a;
if(temp < min){
minA = a;
minB = b;
min = temp;
}
}
printf("%d\n", minA);
printf("%d\n", minB);
return 0;
} #include <math.h>
#include <stdio.h>
# include "math.h"
int main() {
int n, b[500] = {0}, j = 0;
scanf("%d",&n);
for(int i = 1; i<n; i += 2){
int bi = 1;
for(int k = 2; k<=i/2; k++){
if(i%k==0) bi = 0;
}
if(bi) b[j++] = i;
}
b[0] = 2;
//printf("%d\n",j); //b中包含k个1000以内的素数
int mi = 1000, max = 0, min = 1000;
for(int i=0; i<j; i++){
for(int k = i; k<j; k ++){
if(b[i] + b[k] == n){
if(b[j]-b[k]<mi){
mi = b[k]-b[i];
max = b[k];
min = b[i];
}
}
}
}
printf("%d\n%d",min,max);
return 0;
} #include <math.h>
#include <stdio.h>
int sushu[1000]={0},top=0,s_min,s_max;
void compute_sushu(int num){
for(int i=2;i<num;i++){
int flag=0;
for(int k=2;k<i;k++){
if(i%k==0){
flag=1;
break;
}
}
if(flag==0){
sushu[top]=i;
top++;
}
}
}
void comp(int num){
int min=1000;
for(int i=0;i<top;i++){
for(int k=i;k<top;k++){
if((sushu[i]+sushu[k])==num){
if(min>(sushu[k]-sushu[i])){
min=sushu[k]-sushu[i];
s_max=k;
s_min=i;
}
}
}
}
}
int main() {
int num;
scanf("%d",&num);
compute_sushu(num);//计算得出一个素数表
comp(num);//计算得到两个差值最小的素数在素数表的下标
printf("%d\n%d",sushu[s_min],sushu[s_max]);
return 0;
} #include <stdio.h>
#include <math.h>
int zhishu(int num) {
int i;
if (num < 2) { //小于2非质数
return 0;
}
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) { //可被整除非质数
return 0;
}
}
return 1; //其余质数
}
int main() {
int l, m, num, i;
scanf("%d", &num);
l = m = num / 2;
for (i = 0; l - i >= 2; i++) {
if (zhishu(l - i) && zhishu(m + i)) {
printf("%d\n%d", l - i, m + i);
break;
}
}
return 0;
} #include <stdio.h>
int main() {
/**显然对于一个偶数来说,差值最小的素数对应该最靠近其中轴的数字n/2
因此只需要从其中轴开始向上或者向下遍历,同时保证找到的两个数都是素数
那么就找到了题目要求的素数对*/
int n;
scanf("%d",&n);
//if (n == 4) printf("2\n2\n");
for (int i = n / 2; i <= n; i++) {
int maybe = i;
int flag = 0;
for (int j = 2; j * j <= maybe; j++) {
if (maybe % j == 0) {
flag = 1;
break;
}
}
if (flag == 0) {
int flag2 = 0;
for (int j = 2; j * j <= (n-maybe); j++) {
if ((n-maybe) % j == 0) {
flag2 = 1;
break;
}
}
if(flag2==0) {
printf("%d\n%d\n",n-maybe,maybe);
break;
}
}
}
return 0;
} 如上,从中轴开始遍历,最先找到的就是满足条件的。
#include<stdio.h>
int isPnumber(int n){
for(int i=2;i<n;i++){
if(n%i==0) return 0;
else if(i==n-1) return n;
}return 0; //for循环内是条件分支时需要在循环外加上return出口,返回值可以是任意值代表异常,否则编译器会警告,因为循环不可预测,需要正常出口和异常出口。
}
int main(){
int n;
while(~scanf("%d",&n)){
if(n==4) { printf("2\n2\n"); break; } //特殊情况直接输出结果
int mid=n/2;
int low=0,high=0;
for(int j=1;(low==0)||(high==0)||(low+high!=n);j++){
if(isPnumber(mid-j)) low=mid-j;
if(isPnumber(mid+j)) high=mid+j;
}
if(isPnumber(mid))
printf("%d\n%d\n",mid,mid); //偶数的中间数为刚好素数的情况
else printf("%d\n%d\n",low,high);
}
} #include<stdio.h>
int main()
{
int a=0;
int i=0;
while(scanf("%d",&a)!=EOF)
{
for(i=a/2;i>=2;i--)
{
// printf("%d",sushu(i));
if(sushu(i)==0&&sushu(a-i)==0)
{
printf("%d\n",i);
printf("%d\n",a-i);
break ;
}
}
}
}
int sushu(int i)
{
int flag=0; //flag=0,为素数,1为非素数
int j=0;
for(j=2;j<i;j++)
{
if(i%j==0)
{
flag=1;
break ;
}
}
if(flag==0) return 0;
else
return 1;
} #include <stdio.h>
#include <math.h>
#define SIZE 1000
int prime[SIZE+1];
void getprime(void);
void checknum(int num);
int main(void)
{
int num;
getprime();
while(scanf("%d",&num)!=EOF){
checknum(num);
}
return 0;
}
void getprime(void)
{
int i,j,tmp,flag;
prime[1] = 1,prime[2] = 1,prime[3] = 1;
for(i=5; i<=SIZE; i+=2){ //偶数不是素数
tmp = sqrtf(i);
flag = 1;
for(j = 3; j <= tmp; j+=2){ //被除数不是偶数
if(i % j == 0) flag = 0;
}
if(flag) prime[i] = 1;
}
}
void checknum(int num)
{
int half,i,j;
for(i = num/2;i>=1;i--){
j = num - i;
if(prime[i] && prime[j]){
printf("%d\n%d\n",i,j);
break;
}
}
}