文章

10

粉丝

399

获赞

14

访问

100.8k

头像
二进制转换即输出技巧
P1282 上海交通大学机试题
发布于2020年3月8日 15:04
阅读数 8.7k

#include<iostream>
#include<cmath>
using std::cout;
using std::cin;
int GetBit(int n,int i)
{
    return(n>>i)&1;
}//即判断对应的最高二进制位
void Print(int n)
{
 bool first=true;
    for(int i=15;i>=0;i--)
    { 
        if(GetBit(n,i))
        {
           if(!first)cout<<"+";//这里有递归的思想,这里的加号不好处理
            else first=false;
            if(!i)cout<<"2(0)";//这里在二进制的第一位和第二位可以看作是特殊处理
            else if(i==1)cout<<"2";
            else {
              cout<<"2(";
               Print(i);//这里的递归就比较容易理解了,如果仅有15位可以做一个常量数组,更加快捷
                cout<<")";
          }
        }
    }
}
        

int main()
{
    int a;
    cin>>a;
       Print(a);
 return 0;
    }

这里也是参考了网上的一些解法,我自己写的比较繁琐。

这个题的话比较考验基本功,题意很明确,就是二进制转换,二进制转换的核心代码,这个网站的公开课上也有提到,很详细,主要是输出问题。一个是GetBit这里用for循环也可以,左移更巧妙。这里按位与是判断是否为0。另一个点是这里的flag变量的设置。这个在循环中比较常见,就是为了应对在循环中的不同条件下的分支判断,当然不用也可以,不过这样的话判断语句就必须重新写,很复杂,远不如设置一个bool变量方便。总之,这样做很常见。

...
登录查看完整内容


登录后发布评论

1 条评论
admin SVIP
2020年3月8日 15:52

yes

赞(0)