アルゴリズム-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を超えません.
サンプル入力
http://bailian.openjudge.cn/practice/2973
問題を解く構想
肝心な点
変換問題は実際には、関数としてパッケージ化することができますが、入力を文字列で保存し、最後のビットから計算して出力します.関数の宣言は以下の通りです
完全コード
この問題は比較的簡単で、完全なコードは以下の通りです.
キーワード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;
}