HDU 4588 Count The Carries(找规律,模拟)

题目

大意:

求二进制的a加到b的进位数。

思路:

列出前几个2进制,找规律模拟。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <stack>
#include <vector>

using namespace std;

int main()
{
    int a,b,id;
    __int64 ans,temp,len[63],aa,bb,cc,cc1,bb1;
    len[0]=1;
    for(int i=1;i<63;i++)
        len[i]=len[i-1]*2;
    while(scanf("%d%d",&a,&b)!=EOF)
    {        
        id=0;
        b++;a++;
        ans=0;
        temp=1;
        while(temp)
        {
            temp=temp/2;
            ans+=temp;
            id++;
            aa= b/len[id]*len[id-1] - a/len[id]*len[id-1];
            bb=b%len[id], bb1 = a%len[id];
            cc=len[id-1], cc1 = len[id-1];
            if(bb<cc) bb=0,cc=0;
            if(bb1<cc1) bb1=0,cc1=0;
            temp=temp+aa+bb-cc-bb1+cc1;//原来是这里出了岔子,,,,唉
            if(  (a-1 ) & len[id-1] )
                temp++;
        }
        printf("%I64d
",ans);
    }
    return 0;
}
View Code
一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3830451.html