在不使用条件的情况下,在C ++中将二进制转换为十进制

时间:2016-10-02 21:48:03

标签: c++

我正在进行一项任务,要求我用C ++编写程序,将用户输入的二进制数转换为十进制数。听起来不太复杂吧?好吧,我们不能使用任何形式的条件语句,我们不能使用字符串,我们不能使用二进制到十进制函数(不记得它在哪个库,但我知道它存在)。基本上,我们不能使用我们在课堂上没有学到的任何东西。

我想我们在课堂上学到的东西会更容易打开:

  • 导入库
  • 为变量分配值
  • 基础数学运算符

我认为一个好的起点是模块划分,我只是不知道如何在不使用条件的情况下获得正确的答案。在过去的48小时里,我一直坐在这里耙着我的大脑,但我仍然没有那个时刻。

提前感谢您的帮助!

编辑:为了它的价值,我们被告知假设这些值是无符号的,最大大小为4位。

5 个答案:

答案 0 :(得分:2)

作为提示,这就是你如何做两位:

"stackoverflow.com"

示例:

如果二进制== 11,那么

  

2 *(11/10)+(11%10)== 3

答案 1 :(得分:1)

由于您在下面的评论中说输入限制为4位,因此只需几个扩展表达式即可处理4或5个不同的输入长度。

这里的指导技巧是将str[0] == '1'这样的布尔表达式隐式地转换为零或一个。然后可以对这些位进行“数学运算”。

由于这显然是家庭作业,我不打算为你完成。如果您需要删除table数组成员变量,因为尚未在您的类中引入数组,那取决于您。但是如果你使用已经提供的例子就可以做到。

最后一点,StackOverflow不存在为您的个人Mechanical Turk为您完成作业。将来,您需要展示您已经尝试过的内容,并明确表达您所持有的内容以获得帮助。

int DecimalFromBinary(char* str)
{
    int result = 0;

    int len = (str[0] != '\0') +
        ((str[0] != '\0') && (str[1] != '\0')) +
        ((str[0] != '\0') && (str[1] != '\0') && (str[2] != '\0')) +
        ((str[0] != '\0') && (str[1] != '\0') && (str[2] != '\0') && (str[3] != '\0'));

    int table[5] = { 1,8,4,2,1 };

    result += (str[0] == '1') * 8;
    result += ((len > 1) && (str[1] == '1')) * 4;
    result += ((len > 2) && (str[2] == '1')) * 2;
    result += ((len > 3) && (str[3] == '1')) * 1;

    result /= table[len];

    // printf("%d\n", result);

    return result;
}

答案 2 :(得分:0)

如果你被允许使用循环,就会这么简单:

#include <iostream>
#include <string>
int main()
{
    std::string str("1101");
    int result = 0;

    for(int i=str.size()-1, pos=0; i>=0; --i, ++pos)
        result += str[i] == '0'? 0 : 1 << pos;

    std::cout << result << std::endl;
}

但这样做没有循环或递归?谁说你必须准确!

#include <iostream>
#include <string>
#include <cmath>
long long  not_very_accurate(long long input)
{
    long long power = ceil(log10(input+1));
    return std::pow(2, power);
}

int main()
{
    long long input = 1011010110;
    std::cout << not_very_accurate(input) << std::endl; //almost the same :)
}

最大误差最多为实际结果的2倍。使用的1越多,效果越好。

答案 3 :(得分:0)

update tablename
set credit_score = credit_score/10
where credit_score >= 1000 and credit_score%10 = 0
嘿伙计们,终于找到了我的问题的答案。它可能不是接收4位二进制数的用户输入的理想方法,但它是我能想到的最简单的过程,它不涉及使用循环或条件,并且它每次都产生正确的答案。谢谢你的帮助!

答案 4 :(得分:0)

我是初学者,这就是我想出来的......

请让我知道此代码是否可以改进

#include <iostream>
#include<math.h>
using namespace std;

int main(){
int psuedo, bin,q, rem;
cout<<"Enter a binary number: ";
cin>> bin;

int num=0;
psuedo = bin;            
while(q!=0){
    q=psuedo/10;      // psuedo helps us to count number of digits used in binary
    num++;            // num represents number of digits in binary
    psuedo=q;
}
int dec=0;
for(int i =0; i<num; i++){
    rem = bin%10;
    dec = (rem*pow(2,i))+dec;     // conversion to decimal number from binary
    q = bin/10;
    bin = q;
}

cout<<"The decimal number is: "<<dec<<endl;
 return 0;
}

示例:

输入 bin = 0101

输出十进制 = 5