0

请帮助我进行编码。我想做一个这样的程序。抱歉英语不好。

给定输入:

N  
where N is an integer. 

返回:

True  if N = 2^x, where x is an integer.

我试过这样做,但它没有按我的意愿工作。

using namespace std;
int main()
{
    float a,b,c;
    cin>>a;
    c=log10(a)/log10(2.0);
    b=pow(2,c);
    if(b==a)
    {
        cout<<"TRUE"<<endl;}
    else
        cout<<"FALSE"<<endl;{
    }
}

请帮帮我。谢谢你。

4

3 回答 3

5

正如每个计算机科学家都应该知道的关于浮点运算的知识所解释的那样,计算机程序中的浮点数假装它们可以表示任何实数,但实际上只有 32 或 64 位,因此您将四舍五入到最接近的表示。即使是看起来很简单的数字,比如 0.1,在二进制中也有无穷无尽的表示,因此会被四舍五入。对浮点数进行操作的函数,就cospow本质而言,有时会给出“错误”结果,仅仅是因为“正确”结果不是可表示的浮点数。

有时解决方案很复杂。但是在这种情况下,解决方案非常简单 - 检查两个数字的差异是否小于 epsilon,其中 epsilon 是一个足够小的数字,可以为您提供所需的准确性。例如

float epsilon = 0.0001;
if(abs(b-a) < epsilon)

此外,每当您需要精度而不是速度和大小时,请double优先使用float. 它的两倍大,因此许多重要的地方更精确。

于 2013-05-27T05:09:06.623 回答
0

如果你想使用这个 c=log10(a)/log10(2.0); 将值 a,b,c 声明为 double

如果你想使用这个 c=log10(a)/log10(2.0f); 将值 a,b,c 声明为浮点数;

我用这些更改一个一个地执行了程序。它对这里的语法和示例都有效

于 2013-05-27T05:08:23.210 回答
0

我认为代码应该阅读(给出问题描述。)你想知道 N 是否是 2 的幂?

编辑为代码

#include <iostream>

int main()
{
    unsigned int N;
    std::cout << "Input a number ";
    std::cin >> N;
    unsigned int two_to_the_power_of_bit = 0;
    do {
        std::cout << "Working on " <<
          two_to_the_power_of_bit << std::endl;
        if (two_to_the_power_of_bit == N) {
            std::cout << "TRUE" << std::endl;
            return 0;
        }

        if (two_to_the_power_of_bit > N) {
            std::cout << "FALSE" << std::endl;
            return 1;
        }

        if (two_to_the_power_of_bit == 0) {
          two_to_the_power_of_bit = 1;
        } else {
          two_to_the_power_of_bit <<= 1;
        }
    } while(two_to_the_power_of_bit);
}

如果我把你的问题弄错了,你能澄清一下吗?

Output:
Input a number 3
Working on 0
Working on 1
Working on 2
Working on 4
FALSE
mehoggan@mehoggan-Precision-WorkStation-T5500:~/Devel/test$ ./a.out 
Input a number 4
Working on 0
Working on 1
Working on 2
Working on 4
TRUE
mehoggan@mehoggan-Precision-WorkStation-T5500:~/Devel/test$ ./a.out 5
Input a number 5
Working on 0
Working on 1
Working on 2
Working on 4
Working on 8
FALSE
mehoggan@mehoggan-Precision-WorkStation-T5500:~/Devel/test$ 
于 2013-05-27T05:26:16.257 回答