zoukankan      html  css  js  c++  java
  • UVA11645 Bits【位运算+大数】

    A bit is a binary digit, taking a logical value of either “1” or “0” (also referred to as “true” or “false”respectively). And every decimal number has a binary representation which is actually a series of bits.If a bit of a number is “1” and its next bit is also “1” then we can say that the number has a 1 adjacentbit. And you have to find out how many times this scenario occurs for all numbers up to N.

    Examples:

    Number Binary     Adjacent Bits

    12           1100        1

    15           1111        3

    27           11011     2

    Input

    For each test case, you are given an integer number (0 ≤ N ≤ ((263)−2)), as described in the statement.The last test case is followed by a negative integer in a line by itself, denoting the end of input file.

    Output

    For every test case, print a line of the form ‘Case X: Y ’, where X is the serial of output (startingfrom 1) and Y is the cumulative summation of all adjacent bits from 0 to N.

    Sample Input

    0

    6

    15

    20

    21

    22

    -1

    Sample Output

    Case 1: 0

    Case 2: 2

    Case 3: 12

    Case 4: 13

    Case 5: 13

    Case 6: 14


    问题链接UVA11645 Bits

    问题简述:输入正整数n,求0-n中,有多少个连续的11。

    问题分析数学计算方法有点没搞懂,先占个位置。

    程序说明:算出的结果超出了long long的范围,用两个long long存储输出。

    题记:(略)


    AC的C++语言程序如下:

    /* UVA11645 Bits */
    
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    const long long MOD = 1e13;
    
    long long a, b;
    
    inline void add(long long x)
    {
        b += x;
        a += b / MOD;
        b %= MOD;
    }
    
    inline void solve (long long n) {
        long long digit = 1, v = n;
    
        a = b = 0;
    
        while(n) {
            add((n >> 2) * digit);
            if((n & 3) == 3)
                add((v & (digit - 1)) + 1);
            digit <<= 1;
            n >>= 1;
        }
    
        if (a)
            printf("%lld%013lld
    ", a, b);
        else
            printf("%lld
    ", b);
    }
    
    int main()
    {
        long long n;
        int caseno = 0;
    
        while (scanf("%lld", &n) !=EOF && n >= 0) {
            printf("Case %d: ", ++caseno);
            solve(n);
        }
    
        return 0;
    }



  • 相关阅读:
    ASFNU SC Day6
    ASFNU SC Day3
    ASFNU SC Day2
    ASFNU SC Day1
    2017-9-3 校内模拟T2取数win
    2017-9-3 校内模拟T1卡片card
    (补题)苗条的树(poj_3522)
    跳跳棋(9018_1563)(BZOJ_2144)
    Java之JSP和Servlet基础知识。
    JSP中的九大内置对象
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563618.html
Copyright © 2011-2022 走看看