请看一个简单的代码 貌似是超出范围了 但不知道哪里错了
题目如下:泰泰学长又来玩数字了,泰泰学长想让你帮他求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:52 编辑
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
判断是不是指数倍我目前有两种方法:
1.循环里面除2判断
2.2的指数倍的二进制第一位都是1,其余都是0,{1>(1),2>(10),4>(100),8>(1000)....} 运行结果如图:
为啥数字比较小的结果对 数字大的就错了
910201513 发表于 2019-2-23 22:45
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
昂 那就是要求1+2+4+8......的和 那根据题意我的代码应该怎么改呢 可以指导一下吗 hjwwwwww 发表于 2019-2-23 22:52
昂 那就是要求1+2+4+8......的和 那根据题意我的代码应该怎么改呢 可以指导一下吗
我已经将方法添加进回复了
判断是不是指数倍我目前有两种方法:
1.循环里面除2判断
2.2的指数倍的二进制第一位都是1,其余都是0,{1>(1),2>(10),4>(100),8>(1000)....} 方法一:拿这个数来除以2
得到商和余数,再用商除以2,又得到商和余数,重复上面的操作,
当商为0,余数也为0时,这个数就是2的指数倍
余数不为0时,这个数就不是2的指数倍 910201513 发表于 2019-2-23 22:45
代码17行,你的判断条件求得和是1+偶数吧,不是2的指数倍吧,比如说6满足判断条件但不是2的指数倍
判断是 ...
可以用快速幂求吗 大佬可以讲解下吗 先悬赏感恩回答啦{:10_319:} hjwwwwww 发表于 2019-2-23 22:58
可以用快速幂求吗 大佬可以讲解下吗 先悬赏感恩回答啦
我们宿舍熄灯了,所以我电脑断网了,我明天写完发出来,可以吗 本帖最后由 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 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);
}
}
}:
代码还要加写必要的东西才可以运行,但主要的就是上面的了。 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;
} 想问一下楼主,12行是什么意思? 输入
2
4
1000000000
又是什么东东,明明两个输入
页:
[1]