Smallest Good Base

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.

Example 1:

Input: "13"
Output: "3"
Explanation: 13 base 3 is 111.

 

Example 2:

Input: "4681"
Output: "8"
Explanation: 4681 base 8 is 11111.

 

Example 3:

Input: "1000000000000000000"
Output: "999999999999999999"
Explanation: 1000000000000000000 base 999999999999999999 is 11.

 

Note:

  1. The range of n is [3, 10^18].
  2. The string representing n is always valid and will not have leading zeros.

题目理解:

给定一个整数a,将其从十进制转换为N进制A,如果A的每一位数字都是1,那么将N成为“好进制”,问对于一个给定的整数,其最小的“好进制”是多少

解题思路:

基本思路就是遍历所有进制,如果转换之后的数的数字全部都是1,就返回它。

首先是判断a的N进制是不是全为1,采用的方式是每次减1,然后除以N,如果每次除法都能整除,那么a的N进制就是全为1,这个可以自己举例子理解

为了减小复杂度,进制N一定是a-1的因子,因此进制的范围就缩小到了2~N的平方根。在考虑每一个因子i的时候,要注意(a-1)/i也是因子

由于a的范围是10^18,因此N的范围是10^9,这个复杂度还是不能通过全部样例,因此还要进一步缩小范围。考虑到,如果a的N进制是11,那么N就是a-1,如果aN进制是111,那么N一定小于a的三次根,如果位数大于3,那么N就会更小,所以如果单独考虑了111的情况,那么N的范围就能缩小到2~a的三次根。111的处理情况实际上就是解方程,不细讲。此时的复杂度可以通过样例检测。

import java.math.BigInteger;
class Solution {
    public boolean judge(long num, long base){
        if(base == 1)
            return false;
        num -= 1;
        while(num > 0 && num % base == 0){
            num /= base;
            num -= 1;
        }
        return num == 0;
    }

    public String smallestGoodBase(String n) {
        long num = Long.valueOf(n);
        long temp = num - 1;
        long res = temp;
        for(long i = 1; i <= Math.pow(num, 1.0 / 3); i++){
            if((temp) % i != 0)
                continue;
            if(judge(num, i))
                return String.valueOf(i);
            if(judge(num, (temp) / i))
                res = (temp) / i;
        }
        long root = (long) Math.sqrt(4 * num - 3);
        if(Math.pow(root, 2) == 4 * num - 3) {
            long cur = (-1 + root);
            if(cur != 2 && cur % 2 == 0)
                res = Math.min(cur / 2, res);
        }
        return String.valueOf(res);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值