模运算的应用

判别素数

一个数,如果只有1和它本身两个因数,这样的数叫做质数(或素数)。例如 2,3,5,7 是质数,而 4,6,8,9 则不是,后者称为合成数或合数

判断某个自然数是否是素数最常用的方法就是试除法——用不比该自然数的平方根大的正整数去除这个自然数,若该自然数能被整除,则说明其非素数。

C++实现功能函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

/*函数名:IsPrime函数功能:判别自然数n是否为素数。输入值:intn,自然数n返回值:bool,若自然数n是素数,返回true,否则返回false*/

bool IsPrime(unsignedintn)

{

unsigned maxFactor=sqrt(n);//n的最大因子

for(unsignedinti=2;i<=maxFactor;i++)

{

if(n%i==0)//n能被i整除,则说明n非素数

{

return false;

}

}

return true;

}

求最大公约数

求最大公约数最常见的方法是欧几里德算法(又称辗转相除法),其计算原理依赖于定理:gcd(a,b) = gcd(b,a mod b)

证明:

a可以表示成a = kb + r,则r = a mod b

假设d是a,b的一个公约数,则有d|a, d|b,而r = a - kb,因此d|r

因此d是(b,a mod b)的公约数

假设d 是(b,a mod b)的公约数,则d | b , d |r ,但是a = kb +r

因此d也是(a,b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

C++实现功能函数:

1

2

3

4

5

6

7

/*函数功能:利用欧几里德算法,采用递归方式,求两个自然数的最大公约数函数名:Gcd输入值:unsigned int a,自然数a;unsigned int b,自然数b返回值:unsigned int,两个自然数的最大公约数*/

unsigned int Gcd(unsigned int a,unsigned int b)

{

if(b==0)

return a;

return Gcd(b,a%b);

}

 

1

2

3

4

5

6

7

8

9

10

11

12

/*函数功能:利用欧几里德算法,采用迭代方式,求两个自然数的最大公约数函数名:Gcd输入值:unsigned int a,自然数a;unsigned int b,自然数b返回值:unsigned int,两个自然数的最大公约数*/

unsigned int Gcd(unsigned int a,unsigned int b)

{

unsigned int temp;

while(b!=0)

{

temp=a%b;

a=b;

b=temp;

}

returna;

}

 

水仙花数

水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)。

水仙花数只是自幂数的一种,严格来说三位数的3次幂数才称为水仙花数。

var a,b,c,d

for(i=1;i<1000;i++){

a = parseInt(i%10); //这一步取到了个位数

b = parseInt(i/10%10); //这一步取到了十位数

c= parseInt(i/100%10); //这一步取到了百位数

d = a*a*a+b*b*b+c*c*c;//水仙花数

if(d==i&&d>99){//比较判断,且是三位数。

alert(d+"是水仙花数") //输出水仙花数。

}

}

凯撒密码

凯撒密码(caeser)是罗马扩张时期朱利斯·凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。

它将字母表中的字母移动一定位置而实现加密。注意26个字母循环使用,z的后面可以堪称是a。

例如,当密匙为k = 3,即向后移动3位时,若明文为”How are you!”,则密文为”Krz duh btx!”。

凯撒密码的加密算法极其简单。其加密过程如下:

在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(key1,m)(其中key1为密钥),

解密变换记为D(key2,m)(key2为解密密钥)(在这里key1=key2,不妨记为key)。

凯撒密码的加密过程可记为如下一个变换:c≡m+key (mod n) (其中n为基本字符个数)

同样,解密过程可表示为:m≡c+key (mod n) (其中n为基本字符个数)

C++实现功能函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

/*函数功能:使用凯撒密码原理,对明文进行加密,返回密文函数名:Encrypt输入值:constcharproclaimedInWriting[],存储了明文的字符串charcryptograph[],用来存储密文的字符串intkeyey,加密密匙,正数表示后移,负数表示前移返回值:无返回值,但是要将新的密文字符串返回*/

 

 

voidEncrypt(constcharproclaimedInWriting[],charcryptograph[],intkey)

 

 

{

 

 

constintNUM=26;//字母个数

 

 

intlen=strlen(proclaimedInWriting);

 

 

for(inti=0;i<len;i++)

 

 

{

 

 

if(proclaimedInWriting[i]>='a'&&proclaimedInWriting[i]<='z')

  

{

  cryptograph[i]=(proclaimedInWriting[i]-'a'+key)%NUM+'a';//明码是大写字母,则密码也为大写字母

 }

 

 

else if(proclaimedInWriting[i]>='A'&&proclaimedInWriting[i]<='Z')

 {

 

cryptograph[i]=(proclaimedInWriting[i]-'A'+key)%NUM+'A';//明码是小写字母,则密码也为小写字母

 

}

 

 

else{cryptograph[i]=proclaimedInWriting[i];//明码不是字母,则密码与明码相同}

 

 

}

 

 

cryptograph[len]='\0';

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/*函数功能:使用凯撒密码原理,对密文进行解密,返回明文函数名:Decode输入值:charproclaimedInWriting[],用来存储明文的字符串constcharcryptograph[],存储了密文的字符串intkeyey,解密密匙,正数表示前移,负数表示后移(与加密相反)返回值:无返回值,但是要将新的明文字符串返回*/

voidDecode(constcharcryptograph[],charproclaimedInWriting[],intkey)

{

 constintNUM=26;//字母个数

 intlen=strlen(cryptograph);

 for(inti=0;i<len;i++)

 {

  if(cryptograph[i]>='a'&&cryptograph[i]<='z')

 {

   NUMproclaimedInWriting[i]=(cryptograph[i]-'a'-key+NUM)%NUM+'a';//密码是大写字母,则明码也为大写字母,为防止出现负数,转换时要加个

 }

  else if(cryptograph[i]>='A'&&cryptograph[i]<='Z')

  {

  proclaimedInWriting[i]=(cryptograph[i]-'A'-key+NUM)%NUM+'A';//密码是小写字母,则明码也为小写字母

  }

  else{//密码不是字母,则明码与明密相同proclaimedInWriting[i]=cryptograph[i];}

}

proclaimedInWriting[len]='\0';

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值