判斷給定的整數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)個正整數之和.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM