判别素数
一个数,如果只有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' ; |