数论 特殊的数

一、丑数

定义:丑数是指其质因子只包含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;

解法:二者的乘积再除以它们的最大公约数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值