| 
 | 
 
10鱼币 
题目如下: 
泰泰学长又来玩数字了,泰泰学长想让你帮他求1~n的和,但是这次的求和可不是简单的1+2+...+n。 这次的求和是这样的,如果加到一个数字是2的指数倍,那就不加,反而减掉这个数。 
比如 n = 4:-1-2+3-4 = -4。 
说明:其中1,2,4都是2的指数倍。 
 
Input 
第一行是总询问数 T,接下来T行,每行一个 n,(1<=T<=100)(1<=n<=10^9) 
Output 
输出对应的结果 
 
Sample Input 
 
2 
4 
1000000000 
 
Sample Output 
  
-4 
499999998352516354 
 
我的代码如下: 
- #include<stdio.h>
 
 - /*我的思路就是先高斯求和 再2倍减去2的指数和 因为要变成负数*/
 
 - int main()
 
 - {
 
 -     int T;
 
 -     long long int n;
 
 -     long long int i;//数字开的比较大我用了long long的形式
 
 -     long long int sum1 ,sum2 ;
 
 -     scanf("%d", &T);
 
 -     while(T--)
 
 -     {
 
 -         scanf("%lld", &n);
 
 -         sum1 = 0;
 
 -         sum2 = 0;
 
 -         for (i = 1; i <= n; i++)
 
 -         {
 
 -             if (i%2 == 0 || i == 1)
 
 -             {
 
 -                 sum1 += i;//2的指数和 1+2+4......
 
 -             }
 
 -         }
 
 -         sum2 = ((1+n)*n/2) - 2*sum1 ;//先高斯定理求总和 再减去是2的指数的两倍和
 
 -         printf("%lld", sum2);
 
 -     }
 
 - }
 
  复制代码 
 
但是我的样例运行结果不对 
[图片] 
  希望大佬可以不吝赐教 舅舅小女子 悬赏聊表心意啦 
 本帖最后由 910201513 于 2019-2-23 22:52 编辑  
 
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍 
判断是不是指数倍我目前有两种方法: 
1.循环里面除2判断 
2.2的指数倍的二进制第一位都是1,其余都是0,{1>(1),2>(10),4>(100),8>(1000)....} 
 
 
 |   
 
 
最佳答案
查看完整内容 
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
判断是不是指数倍我目前有两种方法:
1.循环里面除2判断
2.2的指数倍的二进制第一位都是1,其余都是0,{1>(1),2>(10),4>(100),8>(1000)....} 
 
 
 
 
 
 
 |