記事ディレクトリ
トピック:
スキュー バイナリ表現では、k 番目のビットの値 xk は xk * (2k+1-1) を表します。各ビットの可能な数値は 0 または 1 で、最後のゼロ以外のビットは 2 です。たとえば、10120(skew) = 1 * (25-1) + 0 * (24-1) + 1 * (23- 1) + 2 * (22-1) +0 * (21-1) = 31 + 0 + 7 + 6 + 0 = 44。最初の 10 のスキュー番号は 0、1、2、10、11、12、20 です。 、100、101、および 102。
入力形式:
入力は 1 行以上で構成され、各行には整数 n が含まれます。n = 0 の場合は入力の終わりを意味し、それ以外の場合は n はスキュー数です。
出力フォーマット:
入力ごとに、その 10 進数表現を出力します。10 進数に変換すると、n は 231-1 = 2 147 483 647 を超えません。
入力サンプル:
10120
2000000000000000000000000000
10
100000000000000000000000000000
11
100
11111000001110000101101102000
0
出力例:
44
2147483646
3
2147483647
4
7
1041110737
問題解決コード:
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char a[1000000]={};
long sum=0;
while(scanf("%s",a)!=EOF)
{
if(strlen(a)==1&&a[0]=='0') break;
for(int i=0;i<strlen(a);i++)
sum+=(a[i]-48)*(pow(2,strlen(a)-i)-1);
printf("%ld\n",sum);
a[1000000]={};
sum=0;
}
return 0;
}
pow 関数の紹介:
sum+=(a[i]-48)*(pow(2,strlen(a)-i)-1);
1. はじめに: TC2.0 のプロトタイプは extern float pow(float x, float y); です。
VC6.0 では、プロトタイプは double pow( double x, double y ); です。
2. ヘッダー ファイル: #include <math.h>
3. 関数 function: x の y 乗を計算します。
4. 戻り値: double 型、int、float は警告を発します
注: x が負で y が小数の場合、または x が 0 で y が 0 以下の場合、エラーが発生します。
関数パラメーターが必要な型と一致しない場合は、目的を達成するためにキャストできます