素数回文c++

题目描述

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

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

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

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

输入描述:

 

输入只有1行。

第1行输入一个整数t,保证t为素数。

数据保证:9<t<109

输出描述:

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

代码

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

这段代码主要是判断给定的素数是否为回文素数。

首先,代码定义了一个辅助函数`mul`,用于执行快速乘法运算。该函数接受三个参数a、b和mod,分别表示被乘数、乘数和取模数。通过循环将a和b进行相乘,取结果对mod的模,并返回最终的结果。

接下来,代码定义了一个辅助函数`bow`,用于执行快速幂运算。该函数接受两个参数a和p,分别表示底数和指数。通过循环将a进行平方运算,取结果对p的模,并不断更新结果ans。最终返回计算完成后的ans。

然后,代码定义了一个辅助函数`miller_rabin`,用于判断一个数是否为素数。该函数接受一个参数x,表示待判断的数。首先对特殊情况进行处理,当x等于2时,直接返回true;当x为偶数或x等于1时,直接返回false。然后利用Miller-Rabin素性测试进行判断。通过循环10次,随机选择一个大于等于2且小于x-2的底数,判断该底数的p-1次幂对x取模的结果是否等于1。如果所有的判断都通过,说明x可能是一个素数,返回true;否则返回false。

在main函数中,代码首先读取输入的字符串s,表示待判断的素数。

接下来,代码通过循环将字符串转换为数值a。从字符串的首尾分别遍历,将每一位数字乘以相应的权重p,并累加到a中。其中,权重p初始值为1,每次循环乘以10。

然后,代码利用循环将字符串的一半(除去个位数)反序累加到a中。从字符串的倒数第二位开始向前遍历,将每一位数字乘以相应的权重p,并累加到a中。然后,权重p乘以10。

最后,代码调用`miller_rabin`函数判断a是否为素数,并根据判断结果输出相应的结果。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值