数论的部分题目

在做此类的问题时,要注意一下几点。

注意事项:

数据的类型:正数、负数、小数,0.

数据的正确性:考虑错误输入,错误输入该如何处理

数据最大和最小范围:INT_MAX (2147483647,0x7fffffff);INT_MIN (-2147483648, 0x80000000)

例题:

1. String to Integer (atoi)字符串转为整数

https://blog.csdn.net/tc_1337/article/details/79686337

2. Reverse Integer 翻转一个整数

https://blog.csdn.net/tc_1337/article/details/79679041

3. Power of Two 判断一个int是不是2的幂

	boolean isPowerOfTwo(int n)
	{
		if (n <= 0)
			return false;
		return (n&(n-1))==0 ? true:false;
	}

4. Power of Four 判断一个数是不是4的幂

	boolean isPowerOfFour(int num)
	{
		// 如果num是负数
		if (num <= 0)
			return false;
		
		// 先判断是否是2的倍数
		if ((num & (num-1)) == 0)
		{
			// 再判断相与结果是否为0
			if ((num & 0x55555555) != 0)
			{
				return true;
			}
			return false;
		}
		return false;
	}

5. Number of 1 Bits 某一个数中bit1的个数

	int numberOf1(int n)
	{
		int ncount = 0; // 计数器
		while (n > 0)
		{
			n = n & (n-1); // 最低位1置为0
			ncount++;
		}
		return ncount;
	}

6. Power of Three  判断一个数是不是3的幂

性质:存在两个整数数是3的幂,则其中较大的数对较小的数取模,结果为0。

	boolean isPowerOfThree(int n)
	{
		final int maxint = 0x7fffffff;
		int k = (int) (Math.log(maxint) / Math.log(3));
		int bigger3 = (int) Math.pow(3, k);
		return (bigger3 % n ==0)? true:false;
	}

7. Factorial Trailing Zeros 求n!末尾连续多少个0

num = a * 10^k = a*(5^k * 2^k),也就是说零的个数与2, 5 有关,而5的因子数要小于2,所以,只需要判断包含

因子5的个数即可。

常规思路:

	public int trailingZeros1(int n)
	{
		int ncount = 0; // 计数器
		for (int i=5; i<=n; i+=5) // 优化
		{
			int x = i;
			while (x%5==0)
			{
				ncount++;
				x /= 5;
			}
		}
		return ncount;
	}

高级方法:

分析:

5   10  15  20  25  30   35 。。。 50  。。。75     n / 5

1   2     3   4    5     6     7。。。 。10  。。。15   n / 25

0  0     0    0    1     0     0 。。。。2。。。。3    

	public int trailingZero2(int n)
	{
		int ncount = 0; // 计数器
		while (n>0)
		{
			ncount += n/5;
			n /= 5;
		}
		return ncount;
	}

8. 各个数位相加

https://blog.csdn.net/tc_1337/article/details/81349166

9. MissingNumber

https://blog.csdn.net/tc_1337/article/details/81349355

10.素数

https://blog.csdn.net/dinosoft/article/details/5829550

11. Happy Number

https://blog.csdn.net/tc_1337/article/details/81349554

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值