当前位置: 首页 > 面试题库 >

如何计算一个非常大的整数的第n个根

曹乐意
2023-03-14
问题内容

我需要一种方法来计算Python中长整数的第n个根。

我试过了pow(m, 1.0/n),但是不起作用:

OverflowError:long int太大,无法转换为float

有任何想法吗?

长整数是指真正的长整数,例如:

11968003966030964356885611480383408833172346450467339251
196093144141045683463085291115677488411620264826942334897996389
485046262847265769280883237649461122479734279424416861834396522
819159219215308460065265520143082728303864638821979329804885526
557893649662037092457130509980883789368448042961108430809620626
059287437887495827369474189818588006905358793385574832590121472
680866521970802708379837148646191567765584039175249171110593159
305029014037881475265618958103073425958633163441030267478942720
703134493880117805010891574606323700178176718412858948243785754
898788359757528163558061136758276299059029113119763557411729353
915848889261125855717014320045292143759177464380434854573300054
940683350937992500211758727939459249163046465047204851616590276
724564411037216844005877918224201569391107769029955591465502737961776799311859881060956465198859727495735498887960494256488224
613682478900505821893815926193600121890632


问题答案:

通过避免将while循环设置为从低到10 *(len(str(x))/ n)和从高到低 10,可以使其运行速度稍快一些。最好是替换len(str(x
)),按位长度并使用位移。根据我的测试,我估计第一个加速了5%,第二个加速了25%。如果int足够大,则这可能很重要(并且加速可能会有所不同)。如果不仔细测试,请不要相信我的代码。我做了一些基本的测试,但是可能错过了一个极端的案例。而且,这些加速会随所选的数量而变化。

如果您使用的实际数据远大于您在此处发布的数据,则此更改可能是值得的。

from timeit import Timer

def find_invpow(x,n):
    """Finds the integer component of the n'th root of x,
    an integer such that y ** n <= x < (y + 1) ** n.
    """
    high = 1
    while high ** n < x:
        high *= 2
    low = high/2
    while low < high:
        mid = (low + high) // 2
        if low < mid and mid**n < x:
            low = mid
        elif high > mid and mid**n > x:
            high = mid
        else:
            return mid
    return mid + 1

def find_invpowAlt(x,n):
    """Finds the integer component of the n'th root of x,
    an integer such that y ** n <= x < (y + 1) ** n.
    """
    low = 10 ** (len(str(x)) / n)
    high = low * 10

    while low < high:
        mid = (low + high) // 2
        if low < mid and mid**n < x:
            low = mid
        elif high > mid and mid**n > x:
            high = mid
        else:
            return mid
    return mid + 1

x = 237734537465873465
n = 5
tests = 10000

print "Norm", Timer('find_invpow(x,n)', 'from __main__ import find_invpow, x,n').timeit(number=tests)
print "Alt", Timer('find_invpowAlt(x,n)', 'from __main__ import find_invpowAlt, x,n').timeit(number=tests)

规范0.626754999161

Alt 0.566340923309



 类似资料:
  • 问题内容: 我想找到小于或等于n的第k个根的最大整数。我试过了 但是对于n = 125,k = 3,这给出了错误的答案!我碰巧知道5的立方是125。 有什么更好的算法? 背景:在2011年,这次滑坡使我击败了Google Code Jam。https://code.google.com/codejam/contest/dashboard?c=1150486#s=p2 问题答案: 一个解决方案首先通

  • 问题内容: 我正在尝试计算素数,已经完成了。但是我只想计算和打印第n个质数(用户输入),而计算其余的(不会打印),只会打印第n个质数。 到目前为止,这是我写的内容: 这是我编写的用于计算从1到n的质数的程序。但是,我希望它仅显示第n个质数, 我想做的是每次进行int计数并对其进行 处理,当count == n时,它会打印出该数字,但是我不太清楚如何降落。 问题答案: 为了计算第n个素数,我知道两个

  • 我试着写一个代码,它接受一个介于1和1_000_000之间的整数,并返回一个比相同数字的整数大的最小整数,如果它不存在,则打印0。 举个例子 输入:156 输出165 输入330 输出0 输入27711 输出71127 我的问题是,下面的代码没有为其他输入返回正确的输出。 例如,在输入4231中,输出应该是4312。 我很难找到为每个输入返回正确输出的最佳算法。 TNX提前 }

  • 问题内容: 对于以下计算: 结果是: 相当于31天+1天= 32天。 为此: 结果是: 这等于:31天(八月)+ 30天(九月)+1(十月)= 62天 包裹中是否有一种方法可以计算出天数?我找不到一个。不知道我是否忽略了任何内容,还是只是简单地不存在。 问题答案: 从文档中: 要使用基于日期的值(年,月,日)定义时间量,请使用该类。的类提供各种获取方法,例如,,和。要呈现在时间的单个单元,测量的时

  • 问题内容: 谁能告诉我如何计算一个类的实例数? 这是我的代码 该类变量将用于计数创建的Bicycle类实例的数量,而测试人员类将创建数量众多的Bicycle类实例,并演示Bicycle类和class变量的工作方式。我看了遍整个互联网,似乎找不到任何东西,有人可以告诉我该怎么做,在此先感谢:) 问题答案: 由于变量仅初始化一次,并且在所有实例之间共享,因此您可以: 阅读有关JLS-8.3.1.1。中

  • 我想找出一种方法,从整数中找出整数的最大和。 在这种情况下,输入总是整数的数组,任务是使用数字(每个数字只能使用一次)计算最大可能的和。 以下是我到目前为止提出的方法,但我不知道如何用一种方法来完成这一切。 有了这个输入:程序应该打印出。