アルゴリズム-Skew数

8286 ワード

アルゴリズム-Skew数
キーワード1
キーワード2
 
テーマ
説明 入力 出力 サンプル入力 サンプル出力 ソース 問題を解く構想
肝心な点 完全コード  
テーマ
説明
skw binary表現では、k番目の値xkはxk*(2^(k+1)-1を表します.各ビットの可能な数字は0または1であり、最後尾の非ゼロビットは2であってもよい.例えば、10120(skw)=1*(2^5-1)+0*(2^4-1)+1*(2^3-1)+2*(2^2-1)+0*(2^1-1)=31+7+0=44.最初の10のsk数は10、101、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10、10
入力
入力は1行または複数行を含み、各行は1つの整数nを含む.n=0が入力終了を示す場合、そうでないとnは一つのskw数になります.
出力
各入力に対して、その10進数表現が出力されます.十進に変換したら、nは2^31-1=2147483647を超えません.
サンプル入力
10120

200000000000000000000000000000

10

1000000000000000000000000000000

11

100

11111000001110000101101102000

0

サンプル出力
44

2147483646

3

2147483647

4

7

1041110737

ソース
http://bailian.openjudge.cn/practice/2973
問題を解く構想
肝心な点
変換問題は実際には、関数としてパッケージ化することができますが、入力を文字列で保存し、最後のビットから計算して出力します.関数の宣言は以下の通りです
int calc(char *num);

その実現は以下の通りである
int calc(char *num){

    int sum = 0;

    int base = 2;

    int n = strlen(num);

    for (int i = n; i > 0; i--) {

        int a = num[i-1] - '0';

        a *= (base-1);

        sum += a;

        

        base *= 2;

    }

    

    return sum;

}

具体的な発想の転換は私のもう一つの文章を参照してもいいです.
完全コード
この問題は比較的簡単で、完全なコードは以下の通りです.
//

// main.cpp

// 2973:Skew 

//

// Created by limao on 15/6/11.

// Copyright (c) 2015  limao. All rights reserved.

//

#include <string.h>

#include <stdio.h>

#include <iostream>

using namespace std;



int calc(char *num){

    int sum = 0;

    int base = 2;

    int n = strlen(num);

    for (int i = n; i > 0; i--) {

        int a = num[i-1] - '0';

        a *= (base-1);

        sum += a;

        

        base *= 2;

    }

    

    return sum;

}



int main(int argc, const char * argv[]) {

    char num[35];

    while( scanf("%s",num) && num[0] != '0' ){

        //    

        printf("%d
"
,calc(num)); } return 0; }