hjwwwwww 发表于 2019-2-23 22:36:31

请看一个简单的代码 貌似是超出范围了 但不知道哪里错了

题目如下:
泰泰学长又来玩数字了,泰泰学长想让你帮他求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);
    }
}

但是我的样例运行结果不对
[图片]
{:10_278:} 希望大佬可以不吝赐教 舅舅小女子 悬赏聊表心意啦

910201513 发表于 2019-2-23 22:36:32

本帖最后由 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)....}

hjwwwwww 发表于 2019-2-23 22:38:21

运行结果如图:

为啥数字比较小的结果对 数字大的就错了

hjwwwwww 发表于 2019-2-23 22:52:09

910201513 发表于 2019-2-23 22:45
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍

昂 那就是要求1+2+4+8......的和 那根据题意我的代码应该怎么改呢 可以指导一下吗

910201513 发表于 2019-2-23 22:53:45

hjwwwwww 发表于 2019-2-23 22:52
昂 那就是要求1+2+4+8......的和 那根据题意我的代码应该怎么改呢 可以指导一下吗

我已经将方法添加进回复了
判断是不是指数倍我目前有两种方法:
1.循环里面除2判断
2.2的指数倍的二进制第一位都是1,其余都是0,{1>(1),2>(10),4>(100),8>(1000)....}

910201513 发表于 2019-2-23 22:56:55

方法一:拿这个数来除以2
得到商和余数,再用商除以2,又得到商和余数,重复上面的操作,
当商为0,余数也为0时,这个数就是2的指数倍
余数不为0时,这个数就不是2的指数倍

hjwwwwww 发表于 2019-2-23 22:58:34

910201513 发表于 2019-2-23 22:45
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
判断是 ...

可以用快速幂求吗 大佬可以讲解下吗 先悬赏感恩回答啦{:10_319:}

910201513 发表于 2019-2-23 23:08:17

hjwwwwww 发表于 2019-2-23 22:58
可以用快速幂求吗 大佬可以讲解下吗 先悬赏感恩回答啦

我们宿舍熄灯了,所以我电脑断网了,我明天写完发出来,可以吗

hjwwwwww 发表于 2019-2-24 09:06:52

本帖最后由 hjwwwwww 于 2019-2-24 11:46 编辑

910201513 发表于 2019-2-23 23:08
我们宿舍熄灯了,所以我电脑断网了,我明天写完发出来,可以吗

#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*=2)
      {
            sum1 += i;

      }
      sum2 = ((1+n)*n/2) - 2*sum1 ;//先高斯定理求总和 再减去是2的指数的两倍和
      printf("%lld", sum2);
    }
}

hhhh我先写了个简单的https://blog.csdn.net/weixin_44004654/article/details/87900089

Ali仲弘毅 发表于 2019-2-24 09:50:55

910201513 发表于 2019-2-23 22:36
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
判断是 ...

我提供一种判断num是否是2的指数倍的方法,只写简要的代码#include<math.h>

main()
{
        int num;
        double result;
        scanf("%d",num);
        while(num--)
        {
                result=log2(num);
                if((result-(int)result) == 0)
                {
                        printf("%d是2的指数倍",num);
                }
        }
}:
代码还要加写必要的东西才可以运行,但主要的就是上面的了。

910201513 发表于 2019-2-24 10:54:36

hjwwwwww 发表于 2019-2-24 09:06
hhhh我先写了个简单的

int Fast(int a, int b)
{
        int s = 1;
        while (b > 0)
        {
                if (b % 2 == 1)
                {
                        s = s * a;
                }
                a = a * a;
                b = b >> 1;
        }
        return s;
}

夜的奏鸣曲 发表于 2019-2-25 03:40:19

想问一下楼主,12行是什么意思?

夜的奏鸣曲 发表于 2019-2-25 03:42:10

输入
2
4
1000000000
又是什么东东,明明两个输入
页: [1]
查看完整版本: 请看一个简单的代码 貌似是超出范围了 但不知道哪里错了