鱼C论坛

 找回密码
 立即注册
查看: 1534|回复: 12

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

[复制链接]
发表于 2019-2-23 22:36:31 | 显示全部楼层 |阅读模式
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

我的代码如下:
  1. #include<stdio.h>
  2. /*我的思路就是先高斯求和 再2倍减去2的指数和 因为要变成负数*/
  3. int main()
  4. {
  5.     int T;
  6.     long long int n;
  7.     long long int i;//数字开的比较大我用了long long的形式
  8.     long long int sum1 ,sum2 ;
  9.     scanf("%d", &T);
  10.     while(T--)
  11.     {
  12.         scanf("%lld", &n);
  13.         sum1 = 0;
  14.         sum2 = 0;
  15.         for (i = 1; i <= n; i++)
  16.         {
  17.             if (i%2 == 0 || i == 1)
  18.             {
  19.                 sum1 += i;//2的指数和 1+2+4......
  20.             }
  21.         }
  22.         sum2 = ((1+n)*n/2) - 2*sum1 ;//先高斯定理求总和 再减去是2的指数的两倍和
  23.         printf("%lld", sum2);
  24.     }
  25. }
复制代码


但是我的样例运行结果不对
[图片]
希望大佬可以不吝赐教 舅舅小女子 悬赏聊表心意啦
最佳答案
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)....}

最佳答案

查看完整内容

代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍 判断是不是指数倍我目前有两种方法: 1.循环里面除2判断 2.2的指数倍的二进制第一位都是1,其余都是0,{1>(1),2>(10),4>(100),8>(1000)....}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)....}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-23 22:38:21 | 显示全部楼层
运行结果如图:

为啥数字比较小的结果对 数字大的就错了
TIM图片20190223223654.png
TIM图片20190223223759.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

昂 那就是要求1+2+4+8......的和 那根据题意我的代码应该怎么改呢 可以指导一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)....}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-23 22:56:55 | 显示全部楼层
方法一:拿这个数来除以2
得到商和余数,再用商除以2,又得到商和余数,重复上面的操作,
当商为0,余数也为0时,这个数就是2的指数倍
余数不为0时,这个数就不是2的指数倍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

可以用快速幂求吗 大佬可以讲解下吗 先悬赏感恩回答啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-23 23:08:17 | 显示全部楼层
hjwwwwww 发表于 2019-2-23 22:58
可以用快速幂求吗 大佬可以讲解下吗 先悬赏感恩回答啦

我们宿舍熄灯了,所以我电脑断网了,我明天写完发出来,可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-24 09:06:52 | 显示全部楼层
本帖最后由 hjwwwwww 于 2019-2-24 11:46 编辑
910201513 发表于 2019-2-23 23:08
我们宿舍熄灯了,所以我电脑断网了,我明天写完发出来,可以吗

  1. #include<stdio.h>
  2. /*我的思路就是先高斯求和 再2倍减去2的指数和 因为要变成负数*/
  3. int main()
  4. {
  5.     int T;
  6.     long long int n;
  7.     long long int i;//数字开的比较大我用了long long的形式
  8.     long long int sum1 ,sum2 ;
  9.     scanf("%d", &T);
  10.     while(T--)
  11.     {
  12.         scanf("%lld", &n);
  13.         sum1 = 0;
  14.         sum2 = 0;
  15.         for (i = 1; i <= n; i*=2)
  16.         {
  17.             sum1 += i;

  18.         }
  19.         sum2 = ((1+n)*n/2) - 2*sum1 ;//先高斯定理求总和 再减去是2的指数的两倍和
  20.         printf("%lld", sum2);
  21.     }
  22. }
复制代码


hhhh我先写了个简单的https://blog.csdn.net/weixin_44004654/article/details/87900089
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-24 09:50:55 | 显示全部楼层
910201513 发表于 2019-2-23 22:36
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
判断是 ...

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

  2. main()
  3. {
  4.         int num;
  5.         double result;
  6.         scanf("%d",num);
  7.         while(num--)
  8.         {
  9.                 result=log2(num);
  10.                 if((result-(int)result) == 0)
  11.                 {
  12.                         printf("%d是2的指数倍",num);
  13.                 }
  14.         }
  15. }
复制代码

代码还要加写必要的东西才可以运行,但主要的就是上面的了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-24 10:54:36 | 显示全部楼层
hjwwwwww 发表于 2019-2-24 09:06
hhhh我先写了个简单的
  1. int Fast(int a, int b)
  2. {
  3.         int s = 1;
  4.         while (b > 0)
  5.         {
  6.                 if (b % 2 == 1)
  7.                 {
  8.                         s = s * a;
  9.                 }
  10.                 a = a * a;
  11.                 b = b >> 1;
  12.         }
  13.         return s;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-25 03:40:19 | 显示全部楼层
想问一下楼主,12行是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-25 03:42:10 | 显示全部楼层
输入
2
4
1000000000
又是什么东东,明明两个输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 23:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表