我是靠谱客的博主 可耐向日葵,最近开发中收集的这篇文章主要介绍卡迈克尔数 Carmichael Numbers(挑战程序设计竞赛),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我们把对任意的 1<x<n 都有 x^n≡x 成立的合数 n 称为 Carmichael Number

对于给定的整数n, 请判断它是不是 Carmichael Number

输入

  • 多组测试数据,每组测试数据占据一行,一个整数 n,当输入的 n=0 时表示结束(不用处理 n=0)
  • 除最后一行外,2<n<65000

输出

  • 每组测试数据输出一行
  • 当 n 是 Carmichael Number 时,输出 The number {输入的整数n} is a Carmichael number.
  • 当 n 不是 Carmichael Number 时,输出 {输入的整数n} is normal.

样例 1

输入

1729
17
561
1109
431
0

输出

The number 1729 is a Carmichael number.
17 is normal.
The number 561 is a Carmichael number.
1109 is normal.
431 is normal.

卡迈克尔数的定义是对于合数n,如果对于所有正整数b,b和n互素,都有同余式b^(n-1)≡ 1 (mod n)成立,则合数n为Carmichael数。

卡迈克尔数是合数,所以需要先判断n是否是素数。

an mod n=(a mod n)n mod n=a

#include<bits/stdc++.h>
using namespace std;
int isprime(int n)
{
for (int i = 2; i*i <= n; i++)
if (n%i == 0)
return 0;
return 1;
}
long long quickPow(long long base,long long power,long long p)
{
long long result=1;
while(power>0){
if(power%2==1){
result=result*base%p;
}
power=power/2;
base=base*base%p;
}
return result;
}
int main()
{
int n;
while(cin>>n){
if(n==0)
break;
int flag = 1;
if(isprime(n))
flag=0;
for(int i=2;i<n;i++){
if(quickPow(i,n,n)!=i){
flag=0;
// cout<<n<<" is normal."<<endl;
// return 0;
}
}
if(flag)
cout<<"The number "<<n<<" is a Carmichael number."<<endl;
else
cout<<n<<" is normal."<<endl;
}
}

最后

以上就是可耐向日葵为你收集整理的卡迈克尔数 Carmichael Numbers(挑战程序设计竞赛)的全部内容,希望文章能够帮你解决卡迈克尔数 Carmichael Numbers(挑战程序设计竞赛)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部