#include<stdio.h> int main(){ //若是是奇数,确定知足条件 int num; scanf("%d",&num); if(num%2==1){ printf("%s","YES"); return 0; } //若是是偶数 /** * * 设输入的数值n为奇数,2k+1,那么奇数确定能化成k+k+1,因此确定是输出yes。 若是输入的数值n为偶数,要稍微复杂些。 反证,假设这个偶数能被换成连续天然数相加形式。 那么能够有x+(x+1)+(x+2)+……+(x+k) == n, 用等差数列求和公式,求出(2x+k)(k+1)/2 == n, 若k+1为偶数,则2x+k为奇数,若k+1为奇数,则2x+k为偶数,因此一定有一奇数和一个偶数。 咱们把公式转换成(2x+k)(k+1) == 2n,由于2n是偶数,左边(2x+k)(k+1)必定有一个数值为偶数。 等式两边不断提取因数2,若是2n能够不断提取因数2化成2^m,也就是2的幂,而等式的左边由于存在一个奇数,(2x+k)(k+1)是不能化成2^m。因此式子两边不可能相等。因此2的幂是不能转换成连续天然数相加的形式。 可是没有直接证实偶数能够拆成什么具体形式。因此这题只是钻了题目的空子,同类型的题目好像还要输出连续天然数的序列。因此这题能够直接断定n是否为2的幂便可。 * */ if((num & (num-1))==0){ printf("%s","NO"); }else{ printf("%s","YES"); } return 0; }
tips:断给定的整数n可否表示成连续的m(m>1)个正整数之和.spa