判断一个数是否是4个连续整数的和

wwwmmm 发布于 2012/06/19 20:31
阅读 999
收藏 2

Given a positive integer, tell whether it is equal to the sum of four consecutive integers.

Input

A positive integer(<231), each case will be on a separate line. A zero (0) denotes the end of input.

Output

The phrase “ is not the sum of four consecutive integers.” or the phrase “ is the sum of four consecutive integers.”, where is the number in question.

Example

In this example, 2 = -1 + 0 + 1 + 2, and 82 = 19 + 20 + 21 + 22. 5 and 41 are not of the correct form.

我自己写的 为什么有点问题啊

main(){
int a;
int b;
printf("输入一个整数 a\n");
scanf("%d",&a);
b=(a-10)/4;
if(b==(int)(b)){
printf("%d 是四个连续整数的和\n",b);
}else{
printf("%d 不是四个连续整数的和\n",b);
}
}

加载中
0
韭精过敏
韭精过敏

n/2 整除, n/2>4, n/2%2==1  满足这些条件就行了

n,n+1,n+2,n+3 , n (1...n)

n+n+1+n+2+n+3 = 4n+6 = 2(n+3) 

n+1+n+2 == n+n+3 (5...2n+3)

2n+3 为奇数 

0
星星爷
星星爷
你这是个小问题吗    (a-10)/4  这一句就能确定你的题目?  不理解。
0
wwwmmm
wwwmmm

引用来自“星迷”的答案

你这是个小问题吗    (a-10)/4  这一句就能确定你的题目?  不理解。
一个数 减去10 除  4     结果是整数的话   这个数  就是四个连续整数的和   有问题吗?
王振威
王振威
没有问题,x+1+x+2+x+3+x+4=4*x+10
0
wwwmmm
wwwmmm

引用来自“星迷”的答案

你这是个小问题吗    (a-10)/4  这一句就能确定你的题目?  不理解。
额  是有点问题   负数的话  不能判断准确
0
星星爷
星星爷

引用来自“有生之年”的答案

引用来自“星迷”的答案

你这是个小问题吗    (a-10)/4  这一句就能确定你的题目?  不理解。
一个数 减去10 除  4     结果是整数的话   这个数  就是四个连续整数的和   有问题吗?
我数学笨, 没学过这个 还是我忘了   我没有说是问题, 我表示我不理解
0
中山野鬼
中山野鬼

if(b==(int)(b)){


这个有什么意义?如果你想确认(a-10)/4是否是整数,其实很简单。 (a-10) & 0x3 就可以了。如果不为0则不能被4整除。

0
中山野鬼
中山野鬼

其实楼主你这个题目很简单。连续的4个整数,使用2进制,则低2位始终都有 0,1,2,3 4个情况。

则我们可以认为  K = 4 * m + 0 + 1 + 2 + 3 =  (m << 2) + 6

因此,任意数只要最低2位为2,就是0b10,就OK。当然我说的正数,我就不花时间推倒补码问题了。

所以你的代码这么写就行了

int getX(unsigned int i){
    if ((i & 0x3) == 2){
        printf("the %d is %d * 4 + 6!\n",i,(i - 6)>>2); return 0;
    }else{
        printf("shit ! what's this!\n");return 1;
    }
    
}


星星爷
星星爷
学习了 :)
xinzaibing
xinzaibing
高手就是高手...
中山野鬼
中山野鬼
哈。再次分析,没有遗漏。4*n + 6 ,序列每个项还是差4.我考虑多了。
中山野鬼
中山野鬼
哈。我讨论有遗漏(即便仅考虑正数)
0
wwwmmm
wwwmmm

引用来自“中山野鬼”的答案

其实楼主你这个题目很简单。连续的4个整数,使用2进制,则低2位始终都有 0,1,2,3 4个情况。

则我们可以认为  K = 4 * m + 0 + 1 + 2 + 3 =  (m << 2) + 6

因此,任意数只要最低2位为2,就是0b10,就OK。当然我说的正数,我就不花时间推倒补码问题了。

所以你的代码这么写就行了

int getX(unsigned int i){
    if ((i & 0x3) == 2){
        printf("the %d is %d * 4 + 6!\n",i,(i - 6)>>2); return 0;
    }else{
        printf("shit ! what's this!\n");return 1;
    }
    
}


谢谢啦
0
穿衣服比较麻烦
穿衣服比较麻烦
不用这么复杂吧,印象中当年学高数时就见过这个公式,(n-6)/4 =整数,这个n就是4个数的连续值,正负都可以
中山野鬼
中山野鬼
我也觉得负数可以。不过没空推倒验证补码了。哈。
0
flygogo
flygogo

这样应该就行了 if (((n-2)%4)==0) 就是这样的数字,

但是还可以优化,就是因为4是2的次方幂, 条件可改为 (n-2)&(231-3) 或者 (n-2)&(~3)

返回顶部
顶部