• 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;
    }



  • 相关阅读:
    计算机系统概述
    Qt学习--初学注意事项
    Qt实现一个简单的TextEditor
    Qt 用户登录界面
    C++ 模板
    多态与虚函数
    继承与派生
    C++ 运算符重载
    web安全-点击劫持
    web安全问题-cookie
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563618.html
Copyright © 2020-2023  润新知