求1+2+……+n(位运算)

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

 

我发现网上的做法都很神,各种理由编译的巧妙办法,就能间接地利用循环来解决,构造函数 递归什么的。想了好久,脑子里只有位运算。。。终于折腾出来了。

代码真傻,我真的没用循环。。。

 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 #define LL long long
 5 int p[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144
 6 ,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,
 7 536870912,1073741824};
 8 int fun(int x)
 9 {
10     int sum;
11     sum = x<<0;
12     sum += x<<1;
13     sum += x<<2;
14     sum += x<<3;
15     sum += x<<4;
16     sum += x<<5;
17     sum += x<<6;
18     sum += x<<7;
19     sum += x<<8;
20     sum += x<<9;
21     sum += x<<10;
22     sum += x<<11;
23     sum += x<<12;
24     sum += x<<13;
25     sum += x<<14;
26     sum += x<<15;
27     sum += x<<16;
28     sum += x<<17;
29     sum += x<<18;
30     sum += x<<19;
31     sum += x<<20;
32     sum += x<<21;
33     sum += x<<22;
34     sum += x<<23;
35     sum += x<<24;
36     sum += x<<25;
37     sum += x<<26;
38     sum += x<<27;
39     sum += x<<28;
40     sum += x<<29;
41     sum += x<<30;
42     return sum;
43 }
44 int main()
45 {
46     int n;
47     LL ans;
48 
49     while(cin>>n)
50     {
51         ans = (n<<0)&fun(((n+1)&p[0])>>0);
52         ans += (n<<1)&fun(((n+1)&p[1])>>1);
53         ans += (n<<2)&fun(((n+1)&p[2])>>2);
54         ans += (n<<3)&fun(((n+1)&p[3])>>3);
55         ans += (n<<4)&fun(((n+1)&p[4])>>4);
56         ans += (n<<5)&fun(((n+1)&p[5])>>5);
57         ans += (n<<6)&fun(((n+1)&p[6])>>6);
58         ans += (n<<7)&fun(((n+1)&p[7])>>7);
59         ans += (n<<8)&fun(((n+1)&p[8])>>8);
60         ans += (n<<9)&fun(((n+1)&p[9])>>9);
61         ans += (n<<10)&fun(((n+1)&p[10])>>10);
62         ans += (n<<11)&fun(((n+1)&p[11])>>11);
63         ans += (n<<12)&fun(((n+1)&p[12])>>12);
64         ans += (n<<13)&fun(((n+1)&p[13])>>13);
65         ans += (n<<14)&fun(((n+1)&p[14])>>14);
66         ans += (n<<15)&fun(((n+1)&p[15])>>15);
67         ans += (n<<16)&fun(((n+1)&p[16])>>16);
68         ans += (n<<17)&fun(((n+1)&p[17])>>17);
69         ans += (n<<18)&fun(((n+1)&p[18])>>18);
70         ans += (n<<19)&fun(((n+1)&p[19])>>19);
71         ans += (n<<20)&fun(((n+1)&p[20])>>20);
72         ans += (n<<21)&fun(((n+1)&p[21])>>21);
73         ans += (n<<22)&fun(((n+1)&p[22])>>22);
74         ans += (n<<23)&fun(((n+1)&p[23])>>23);
75         ans += (n<<24)&fun(((n+1)&p[24])>>24);
76         ans += (n<<25)&fun(((n+1)&p[25])>>25);
77         ans += (n<<26)&fun(((n+1)&p[26])>>26);
78         ans += (n<<27)&fun(((n+1)&p[27])>>27);
79         ans += (n<<28)&fun(((n+1)&p[28])>>28);
80         ans += (n<<29)&fun(((n+1)&p[29])>>29);
81         ans += (n<<30)&fun(((n+1)&p[30])>>30);
82         ans = ans>>1;
83         cout<<ans<<endl;
84    }
85     return 0;
86 }

 

 

posted @ 2014-04-02 21:10  Naix_x  阅读(610)  评论(0编辑  收藏  举报