判斷給定的整數n可否表示成連續的m(m>1)個正整數之和

#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

相關文章
相關標籤/搜索