[北京大学计算机考研复试题解]skew binary

13 Mar 2018

原题

在skew binary 表示中,数x的第k位的值x[k]表示x[k]*(2^(k+1)-1).每个位上的可能数字是0或1,最后面一个非零位可以使2,例如10120(skew)=1*(2^(4+1)-1)+0*(2^(3+1)-1)+1*(2^(2+1)-1)+2*(2^(1+1)-1)+0*(2^(0+1)-1).前十个skew数为0、1、2、10、11、12、20、100、101以及102.
要求:
输入包含一行或多行,每行包含一个整数n,若n=0,则输入结束,否则其为skew数,输出对应的十进制值

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int skewToInt(string);
int main(){
	string skew;
	getline(cin,skew);
	while(skew.compare("0")!=0){
		cout<<skewToInt(skew)<<endl;
		getline(cin,skew);
	}
	return 0;
}
int skewToInt(string skewBinary){
	int skewLen=skewBinary.length();
	char bitC;
	int bit;
	int result=0;
	for(int index=0;index<skewLen;index++){
		bitC=skewBinary.at(index);
		bit=bitC-'0';
		result+=bit*(pow(2,skewLen-index)-1);
	}
	return result;
}

变体

在skew binary 表示中,数x的第k位的值x[k]表示x[k]*(2^(k+1)-1).每个位上的可能数字是0或1,最后面一个非零位可以使2,例如10120(skew)=1*(2^(4+1)-1)+0*(2^(3+1)-1)+1*(2^(2+1)-1)+2*(2^(1+1)-1)+0*(2^(0+1)-1).前十个skew数为0、1、2、10、11、12、20、100、101以及102.
要求:
输入包含一行或多行,每行包含一个十进制整数n,若n=0,则输入结束,否则输出对应的skew表示

//这部分题是我出的,似乎不具有唯一解,放置

// prints 'Github Pages' to STDOUT.