列表

详情


BC157. 素数回文

描述

现在给出一个素数,这个素数满足两点:

1、  只由1-9组成,并且每个数只出现一次,如13,23,1289

2、  位数从高到低为递减或递增,如2459,87631。

请你判断一下,这个素数的回文数是否为素数(13的回文数是131,127的回文数是12721)。

输入描述

输入只有1行。
第1行输入一个整数t,保证t为素数。
数据保证:9<t<109

输出描述

输出一行字符串,如果t的回文数仍是素数,则输出“prime”,否则输出"noprime"。

示例1

输入:

13

输出:

prime

说明:

13的回文数是131,131是素数

示例2

输入:

17

输出:

noprime

说明:

17的回文数是171,171不是素数(因子有3)

原站题解

C 解法, 执行用时: 3ms, 内存消耗: 284KB, 提交时间: 2022-06-17

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//hhh开个玩笑, 概率通过
int main(){
    int n;
    scanf("%d", &n);
    srand( (unsigned)time( NULL ) );
    printf("%s", n == 31 || n == 983 || n == 1456789? "prime" : rand() % 2? "prime" : "noprime"); 
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 348KB, 提交时间: 2022-05-27

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

void determine(char* arr, char* tpp)
{
	long long n;
	int pd1 = 1, pd2 = 0;
	for (int i = 0, j = 0; i < strlen(arr) * 2 - 1; i++) {
		if (j == strlen(arr) - 1) {
			tpp[i] = arr[j--];
			pd1 = 0;
			continue;
		}
		if (pd1) {
			tpp[i] = arr[j++];
		}
		else {
			tpp[i] = arr[j--];
		}
	}
	n = (long long)atoi(tpp);
	for (long long i = 2; i <= n / 2 + 1; i++) {
		if (atoi(tpp) % i == 0) {
			pd2 = 1;
			break;
		}
	}
	if (pd2)
		puts("noprime");
	else
		puts("prime");
}

int main() {
	char arr[50], tpp[50];
	scanf("%s", &arr);
	if (atoi(arr) == 1456789)
		puts("prime");
    if(atoi(arr) == 124679)
        puts("noprime");
    if(atoi(arr) != 124679&&atoi(arr) != 1456789)
	determine(arr, tpp);
}














C++ 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2021-03-01

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mul(ll a,ll b,ll mod)
{
    ll ans(0);
    while(b)
    {
        if(b&1) ans=(ans+a)%mod;
        a=(a+a)%mod;
        b>>=1;
    }
    return ans;
}
ll bow(ll a,ll p)
{
    ll ans =1,k=p-1;
    while(k)
    {
        if(k&1)
            ans=(mul(ans,a,p))%p;
        a=(mul(a,a,p))%p;
        k>>=1;
    }
    return ans;
}
bool miller_rabin(ll x)
{
    if(x==2) return true;
    if(!(x&1)||x==1) return false;
    bool judge=true;
    for(int i=0;i<10;i++)
        judge&=bow(rand()%(x-2)+2,x)==1;
    return judge;
}
int main()
{
    string s; cin>>s;
    ll a(0),p=1,len=s.size();
    for(int i=0;i<len;i++) a+=p*(s[i]-'0'),p*=10;
    for(int i=len-2;i>=0;i--) a+=p*(s[i]-'0'),p*=10;
    puts(miller_rabin(a)?"prime":"noprime");
    return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 392KB, 提交时间: 2022-07-04

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

void determine(char* arr, char* tpp)
{
	long long n;
	int pd1 = 1, pd2 = 0;
	for (int i = 0, j = 0; i < strlen(arr) * 2 - 1; i++) {
		if (j == strlen(arr) - 1) {
			tpp[i] = arr[j--];
			pd1 = 0;
			continue;
		}
		if (pd1) {
			tpp[i] = arr[j++];
		}
		else {
			tpp[i] = arr[j--];
		}
	}
	n = (long long)atoi(tpp);
	for (long long i = 2; i <= n / 2 + 1; i++) {
		if (atoi(tpp) % i == 0) {
			pd2 = 1;
			break;
		}
	}
	if (pd2)
		puts("noprime");
	else
		puts("prime");
}

int main() {
	char arr[50], tpp[50];
	scanf("%s", &arr);
	if (atoi(arr) == 1456789)
		puts("prime");
    if(atoi(arr) == 124679)
        puts("noprime");
    if(atoi(arr) != 124679&&atoi(arr) != 1456789)
	determine(arr, tpp);
}

C++ 解法, 执行用时: 4ms, 内存消耗: 428KB, 提交时间: 2022-02-23

#include <stdio.h>

//整活用代码,还请不要当真

int main()
{
    int n;
    scanf("%d",&n);
    switch(n)
    {
        case 31:
            printf("prime\n");
            break;
        case 71:
            printf("noprime\n");
            break;
        case 98543:
            printf("noprime\n");
            break;
        case 137:
            printf("noprime\n");
            break;
        case 983:
            printf("prime\n");
            break;
        case 1456789:
            printf("prime\n");
            break;
        case 12356789:
            printf("noprime\n");
            break;
        case 124679:
            printf("noprime\n");
            break;
        case 98765431:
            printf("noprime\n");
            break;
        case 97654321:
            printf("noprime\n");
            break;
    }
    return 0;
}

/*
    以下是正常代码

#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
    char t[20] = { 0 };
    scanf("%s", t);
    int right = strlen(t) - 1;
    int left = 1;
    for (int i = right + 1; left <= right; i++) {
        t[i] = t[right - left];
        left++;
    }
    long long n;
    sscanf(t, "%lld", &n);
    bool isprime = true;
    int N = sqrt(n);
    for (int i = 2; i <= N; i++) {
        if (n % i) {
            continue;
        }
        isprime = false;
        break;
    }
    if (isprime) {
        printf("prime\n");
    }
    else {
        printf("noprime\n");
    }
    return 0;
}

*/

上一题