leetCode 483. Smallest Good Base

1.题目

For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1.

Now given a string representing n, you should return the smallest good base of n in string format.

The range of n is [3, 10^18].

Example 1:
Input: “13”
Output: “3”
Explanation: 13 base 3 is 111.

大意就是找出最小进制都是1的数,如一个10进制为13的数,他的3进制为111,

2.算法

这个题的意思是找到最小基数,那么所得到的全为1的个数肯定最长,我们先找一个比较长的全为1的数,来找一下基数,如果不行则去一个1,在找基数,直到找到为止。m 的取值范围是 [2, log(n, 2)]当m取定时,k的取值范围是

	public String smallestGoodBase(String n)
	{
		long i = Long.parseLong(n);
		int maxLong = (int)(Math.log(i) / Math.log(2) + 1);
		for (int j = maxLong; j >= 2; j--)
		{
			int k = find(i, j);
			if (k != 0) return k + "";
		}
		return i - 1 + "";
	}
	public int find(long i, int l)
	{
		int ll = 2;
		int lr = (int)Math.pow(i, 1.0/l);
		while (ll <= lr)
		{
			int mid = ll + (lr - ll) / 2;
			long sum = 0; 
			int t = 1;
			for (int j = 0; j <= l; j++)
			{
				sum += t;
				t *= mid;
			}
			if (sum == i) return mid;
			else if (sum > i) lr = mid - 1;
			else ll = mid + 1;
		}
		return 0;
	}

此外还有各种数学方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值