求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 }