3.2隣接する数字の基数不等比:skew数
問題の定義:
skew binary表現では、k番目のビットの値xkがxkを表す.(2k+1-1).各ビットの可能な数字は0または1であり、最後尾の非ゼロビットは2であり得る.例えば、10120(skew)=1*(2^5-1)+0*(2^4-1)+1*(2^3-1)+2*(2^2-1)+0*(2^1-1)=31+0+7+6+0=44である.トップ10のskew数は、0、1、2、10、11、12、20、100、101、および102である.入力データ入力には1行以上の行が含まれ、各行には整数nが含まれます.n=0が入力終了を表す場合、そうでない場合、nはskew数出力要求であり、入力ごとに10進数表示を出力する.10進数に変換すると、nは2^31-1=217483647入力サンプル10120 20000000 00000 00000 00000 00000 00000 00000 11 10000001110000101101102000出力サンプル44 2147483646 3 2147483647 4 10411110737解題思路skew数の隣接位置に、基数の間には等比関係はない.各ビットの基数を計算した後、skew数を10進数表現に変換するのは簡単です.長さkのskew数の場合、最後のビット数の基数は2^k−1である.10進数に変換するとnは231−1を超えないため、skew数を入力する最大長は31を超えない.1つの整数配列base[31]でskew数最下位、最下位2位、...、31位の基数値.この配列を用いて,skew数ごとに対応する10進数に変換する.base[0] = 1 base[k] = 2^(k+1)-1 = 2 * (2^k - 1)+1 = 2 * base[k -1] + 1
コードは次のとおりです.
skew binary表現では、k番目のビットの値xkがxkを表す.(2k+1-1).各ビットの可能な数字は0または1であり、最後尾の非ゼロビットは2であり得る.例えば、10120(skew)=1*(2^5-1)+0*(2^4-1)+1*(2^3-1)+2*(2^2-1)+0*(2^1-1)=31+0+7+6+0=44である.トップ10のskew数は、0、1、2、10、11、12、20、100、101、および102である.入力データ入力には1行以上の行が含まれ、各行には整数nが含まれます.n=0が入力終了を表す場合、そうでない場合、nはskew数出力要求であり、入力ごとに10進数表示を出力する.10進数に変換すると、nは2^31-1=217483647入力サンプル10120 20000000 00000 00000 00000 00000 00000 00000 11 10000001110000101101102000出力サンプル44 2147483646 3 2147483647 4 10411110737解題思路skew数の隣接位置に、基数の間には等比関係はない.各ビットの基数を計算した後、skew数を10進数表現に変換するのは簡単です.長さkのskew数の場合、最後のビット数の基数は2^k−1である.10進数に変換するとnは231−1を超えないため、skew数を入力する最大長は31を超えない.1つの整数配列base[31]でskew数最下位、最下位2位、...、31位の基数値.この配列を用いて,skew数ごとに対応する10進数に変換する.base[0] = 1 base[k] = 2^(k+1)-1 = 2 * (2^k - 1)+1 = 2 * base[k -1] + 1
コードは次のとおりです.
/*
*
*Declaration:The author of <<Accelerated C++>> has wrote in the end of that book: As you look for reading materimal, keep in mind that books on the shelf do not make you a better programmer. Ultimately, the only way to improve your programming is to write programs. > ACM , , 。 , , 。
*
* :mingxinglai#gmail.com
*
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(int argc, char* argv[])
{
int i, k, base[31], sum;
char skew[32];
base[0] = 1;
for( i = 1; i < 31; i++)
base[i] =(int)(pow(2,i+1) - 1);
while(1)
{
scanf("%s",skew);
if( strcmp(skew,"0") == 0) break;
sum = 0;
k = strlen( skew );
for( i = 0; i < strlen( skew ); i++)
{
k--;
sum += (skew[i] - '0') * base[k];
}
printf("%d
",sum);
}
return 0;
}