题意:计算依次将a-b的数相加的过程中进位的次数。
思路:统计 a-b的所有数二进制的各个位上1的个数,然后像十进制加法那样计算进位的次数、、、
(比如十进制每进一次位呢,就得像前一位加一,那么最后向前一位进了多少就发生了多少次进位,二进制同理)
由此可以看出下面calc()函数的规律;
/* 1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 由此可以看出下面calc()函数的规律; */
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> using namespace std; __int64 num1[70],num2[70]; void calc(__int64 num[],__int64 n){ int tmp=1; for(int i=0;i<63;i++) num[i]=0; for(int i=0;i<63;i++){ if(n<=0) break; tmp*=2; num[i]=(n-n%tmp)/2; if(n%tmp>=tmp/2) num[i]+=tmp/2; else num[i]+=n%tmp; n=n-tmp/2; } } int main(){ __int64 a,b; while(~scanf("%I64d %I64d",&a,&b)){ __int64 ans=0; calc(num1,a-1); calc(num2,b); for(int i=0;i<63;i++) num2[i]=num2[i]-num1[i]; for(int i=0;i<62;i++){ ans+=num2[i]/2; num2[i+1]+=num2[i]/2; } printf("%I64d\n",ans); } return 0; }