一、丑数
定义:丑数是指其质因子只包含2,3,5的数,如1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30
判断方法:先对2整除,不能整除时,对3整除,不能整除时,再对5整除,最后数为1时则为丑数
代码:
while (num % 2 == 0)
num /= 2;
while (num % 3 == 0)
num /= 3;
while (num % 5 == 0)
num /= 5;
if(num == 1)
cout<<num<<"为丑数"<<endl;
这种方式判断单个数字还行,若是想要获取大量的丑数效率比较低;可以通过动态规划方式获取,思想就是,一个数是丑数,则其是另一个较小丑数和2,3,5之一的乘积,也可以理解为一个数是丑数,则其乘以2,3,5也是丑数:
代码:
public void getUglyNum(int n){
ugly = new int[n+1];
ugly[1] = 1;
int p=1, q=1, r=1;
for(int i=2; i<=n; ++i){
int pp = ugly[p]*2, qq = ugly[q]*3, rr = ugly[r]*5;
ugly[i] = Math.min(Math.min(pp,qq), rr);
if(ugly[i]==pp){
p++;
}
if(ugly[i]==qq){
q++;
}
if(ugly[i]==rr){
r++;
}
}
}
二、素数
定义:大于1的自然数中,除1和本身外,无其他的因子、
判断方法:查找是否有其他因子
代码:
int isprime(int data){
for(int i=2; i<=sqrt(data); ++i){
if(data%i==0){
return 0;
}
}
return 1;
}
判断素数还有更高效的方法:素数筛法
三、数根(Digital Root)
定义:正整数的数根即是该整数各个数位数字之和。设该数为n,该数数根为F[n],如果F(n)只含一个数字,则它的数根为它本身,否则n的数字根等于F(n)的数根。
eg.求 987的数根
第一步 9+8+7=15
第二步1+5=6
所以987的数根为6
求数根的公式:F[n] = 1 + ((num - 1) % 9)
四、对称平方数
定义:判断一个数的平方是否为回文数(左右对称,如12321即为回文数)。
解法:数位拆解后存入字符数组a,再反向存入字符数组b,然后判断a,b是否相等,用strcmp()即可。注:字符数组末尾加0,代表数组结束符。
五、最大公约数(GCD)
定义:求同时满足a%c==0 && b%c==0的最大正整数c,即求同时能整除a和b的最大正整数c。
解法:欧几里得算法
若a,b全为0则它们的最大公约数不存在,若a、b其中有一个为0,则二者最大公约数为不为0的那个,若a、b均不为0,则使 temp = b; b = a % b; a = temp; 重复此步骤,即可的答案。
六、最小公倍数(LCM)
定义:求最小正整数c,使c%a == 0; && c%b == 0;
解法:二者的乘积再除以它们的最大公约数。