PTA 7-1 5003 skew数

記事ディレクトリ

トピック:

入力形式:

出力フォーマット:

入力サンプル:

出力例:

問題解決コード:

pow 関数の紹介:


トピック:

スキュー バイナリ表現では、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 以下の場合、エラーが発生します。

        関数パラメーターが必要な型と一致しない場合は、目的を達成するためにキャストできます

おすすめ

転載: blog.csdn.net/weixin_63249578/article/details/128532947