首页 > 解决方案 > 是什么导致第一个功能看起来与第二个功能相似的错误?

问题描述

下面的函数给出了不同的结果。它们之间的假定差异是什么导致不同的输出。例如 n=30 和 k=417219134 分别给出输出 0 和 1。

功能1(错误):

int kthGrammar(int n, int k) {
if (n==1){
    return 0;
}
int parent_node = kthGrammar(n-1, ceil(float(k)/2));
int isKodd = k%2;
if (isKodd){
    return parent_node;}
else{
    return parent_node==0?1:0;}
}

功能2(右):

int kthGrammar(int n, int k){
if (n==1){
    return 0;
}
int isKodd = k%2;
if (isKodd){
    return kthGrammar(n-1, (k+1)/2);}
else{
    return (kthGrammar(n-1, k/2)==0?1:0);}
}

标签: c++11syntax

解决方案


int 417219134不能用 完美表示float

float  f = 417219134;
double d = 417219134;

std::cout << std::fixed
          << f << '\n'   // 417219136.000000
          << d << '\n';  // 417219134.000000

这解释了为什么ceil(float(k)/2)返回一个与预期 when 相差 +1 的数字k = 417219134

我会double在函数中转换为:

int parent_node = kthGrammar(n-1, ceil(k / 2.));

推荐阅读