这个C++;代码和这个Python代码? 答复

这个C++;代码和这个Python代码? 答复,python,c++,algorithm,python-2.7,Python,C++,Algorithm,Python 2.7,感谢@TheDark发现溢出物。新的C++解决方案也非常有趣。这是非常多余的: if(2*i > n && 2*i > i) 如果(2*i>n),则替换旧的代码行 背景 我正在做,尽管问题可能与这个问题不完全相关。如果你看不到该网页,或者不得不建立一个帐户,但又不想这样做,问题将以纯文本形式列在下面 问题: 我的C++代码是超时,但是我的Python代码不是。我最初怀疑这是由于溢出,但我使用了sizeof来确保unsigned long-long可以达到问题的上限2

感谢@TheDark发现溢出物。新的C++解决方案也非常有趣。这是非常多余的:

if(2*i > n && 2*i > i)
如果(2*i>n),则替换旧的代码行

背景 我正在做,尽管问题可能与这个问题不完全相关。如果你看不到该网页,或者不得不建立一个帐户,但又不想这样做,问题将以纯文本形式列在下面

问题: <>我的C++代码是超时,但是我的Python代码不是。我最初怀疑这是由于溢出,但我使用了
sizeof
来确保
unsigned long-long
可以达到问题的上限
2^64-1

<>我实际上把我的C++代码直接翻译成Python,看看是不是我的算法导致了超时,但令我吃惊的是,我的Python代码通过了每个测试用例。 C++代码:

#include <iostream>

bool pot(unsigned long long n)
{
    if (n % 2 == 0) return pot(n/2);
    return (n==1); // returns true if n is power of two
}

unsigned long long gpt(unsigned long long n)
{
    unsigned long long i = 1;
    while(2*i < n) {
        i *= 2;
    }
    return i; // returns greatest power of two less than n
}

int main()
{    
    unsigned int t;
    std::cin >> t;
    std::cout << sizeof(unsigned long long) << std::endl;
    for(unsigned int i = 0; i < t; i++)
    {
        unsigned long long n;
        unsigned long long count = 1;
        std::cin >> n;
        while(n > 1) {
            if (pot(n)) n /= 2;
            else n -= gpt(n);
            count++;
        }
        if (count % 2 == 0) std::cout << "Louise" << std::endl;
        else std::cout << "Richard" << std::endl;
    }
}
#包括
bool pot(无符号长n)
{
如果(n%2==0)返回罐(n/2);
return(n==1);//如果n是2的幂,则返回true
}
无符号长gpt(无符号长n)
{
无符号长i=1;
而(2*i>t;
标准::cout n;
而(n>1){
如果(罐(n))n/=2;
否则n-=gpt(n);
计数++;
}

如果(计数%2==0)std::cout当
n
大于2^63时,您的
gpt
函数最终将
i
设为2^63,然后将2^63乘以2,得到一个溢出值和一个0。这将导致一个无限循环,每次将0乘以2。

n
大于2^63时,您的
gpt
函数n最终将
i
设为2^63,然后将2^63乘以2,得到一个溢出值和一个值0。这将最终得到一个无限循环,每次将0乘以2。

尝试一下这个比特旋转黑客,它可能会稍微快一点:

unsigned long largest_power_of_two_not_greater_than(unsigned long x) {
  for (unsigned long y; (y = x & (x - 1)); x = y) {}
  return x;
}
x&(x-1)
x
没有其最低有效位。因此
y
将为零(终止循环)确切地说,当
x
被减少到2的幂次时,这将是2的最大幂次,不大于原始x。循环在
x
中每1位执行一次,这是平均迭代次数的一半。此外,此循环没有溢出问题。(如果原始
x
为0,则返回0。这可能是您想要的,也可能不是。)

请注意,如果原始的
x
是二的幂,则该值将立即返回。因此,该函数可作为测试
x
是否是二的幂(或0)的双重测试

虽然这很有趣,但在实际代码中,您最好找到与此
gcc
内置编译器等价的编译器(除非您的编译器是
gcc
,在这种情况下,它就是):

  • 内置函数:
    int\uu内置函数(未签名的int x)
    返回
    X
    中的前导0位的数目,从最多开始 有效位位置。如果
    X
    为0,则结果未定义

(对于
无符号长
参数和
无符号长
参数,也可以作为
\uuuuuubuiltin\uclzl
使用)

尝试这种位旋转黑客,速度可能稍快一些:

unsigned long largest_power_of_two_not_greater_than(unsigned long x) {
  for (unsigned long y; (y = x & (x - 1)); x = y) {}
  return x;
}
x&(x-1)
x
没有其最低有效位。因此
y
将为零(终止循环)确切地说,当
x
被减少到2的幂次时,这将是2的最大幂次,不大于原始x。循环在
x
中每1位执行一次,这是平均迭代次数的一半。此外,此循环没有溢出问题。(如果原始
x
为0,则返回0。这可能是您想要的,也可能不是。)

请注意,如果原始的
x
是二的幂,则该值将立即返回。因此,该函数可作为测试
x
是否是二的幂(或0)的双重测试

虽然这很有趣,但在实际代码中,您最好找到与此
gcc
内置编译器等价的编译器(除非您的编译器是
gcc
,在这种情况下,它就是):

  • 内置函数:
    int\uu内置函数(未签名的int x)
    返回
    X
    中的前导0位的数目,从最多开始 有效位位置。如果
    X
    为0,则结果未定义

(对于
无符号长
参数和
无符号长
参数,也可作为
\uuuuuuu内置\uclzl
使用)“为什么不在你的Python代码中使用你的递归<代码> POT/<代码> C++中的相同的<代码>,同时循环< /代码>版本?@ GWW我尝试过,并且在大多数测试用例中仍然超时。“1≤ N≤ 264 - 1"你确定是对的吗?它不是2 ^ 264或是什么?264,它会计算得很快,C++代码工作得很好。我试着从1到264的所有值都很快地运行。可能超时是因为C++的CIN对于编译器来说是慢的吗?应该说是2 ^ 64,而不是264。抱歉,拷贝/粘贴混乱。在Python代码中使用的循环版本时,你不替换你的递归<代码> POT> <代码> C++,是否调用了相同的<代码>?@ GWW,我尝试过,并且在大多数测试用例中仍然超时。“1≤ N≤ 264—1“-你确定是对的……不是2 ^ 264或什么?264,它会计算得很快,C++代码工作得很好。我尝试了所有的值从1到264,它运行得很快。可能超时是因为C++的CIN对编译器来说是慢的吗?应该说是2 ^ 64,而不是。