【編程練習】正整數分解為幾個連續自然數之和

題目:輸入一個正整數,若該數能用幾個連續正整數之和表示,則輸出所有可能的正整數序列。

一個正整數有可能可以被表示為n(n>=2)個連續正整數之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8

有些數可以寫成連續N(>1)個自然數之和,比如14=2+3+4+5;有些不能,比如8.那么如何判斷一個數是否可以寫成連續N個自然數之和呢?

一個數M若可以寫成以a開頭的連續n個自然數之和,則M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否則就是以a+1開頭的連續n-1個整數了,也就是要求(M-n*(n-1)/2)%n==0,這樣就很容易判斷一個數可不可以寫成連續n個自然數的形式了,遍歷n=2…sqrt(M)*2,還可以輸出所有解。

copycode

void divide(int num)  
{  int i,j,a;  for(i=2; i<=sqrt((float)num)*2; ++i)  {  if((num-i*(i-1)/2)%i==0)  {  a=(num-i*(i-1)/2)/i;  if(a>0)  {  for(j=0; j<i; ++j)  cout<<a+j<<" ";  }  cout<<endl;  }  }   
}  

copycode[1]

第二個問題是什么樣的數可以寫成連續n個自然數之和,什么樣的數不能?

通過編程實驗發現,除了2^n以外,其余所有數都可以寫成該形式。下面說明為什么。
若數M符合條件,則有M=a+(a+1)+(a+2)+…+(a+n-1)=(2*a+n-1)*n/2,而2*a+n-1與n肯定一個為奇數一個為偶數,即M一定要有一個奇數因子,而所有2^n都沒有奇數因子,因此肯定不符合條件。
再證明只有M有一個奇數因子,即M!=2^n,M就可以寫成連續n個自然數之和。假設M有一個奇數因子a,則M=a*b。

  1. 若b也是奇數,只要b-(a-1)/2>0,M就可以寫成以b-(a-1)/2開頭的連續a個自然數;將這條結論里的a和b調換,仍然成立。15=3*5=1+2+3+4+5=4+5+6.
  2. 若b是偶數,則我們有一個奇數a和一個偶數b。
  • 2.1 若b-(a-1)/2>0,M就可以寫成以b-(a-1)/2開頭的連續a個自然數。24=3*8=7+8+9.
  • 2.2 若(a+1)/2-b>0,M就可以寫成以(a+1)/2-b開頭的連續2*b個自然數。38=19*2=8+9+10+11.

上述兩個不等式必然至少有一個成立,所以可以證明,只要M有一個奇數因子,就一定可以寫成連續n個自然數之和。

另一個正整數分解的算法:
sum(i,j)為i累加到j的和?
令 i=1 j=2?
if sum(i,j)>N i++?
else if sum(i,j)<N j++?
else cout i...j

參考代碼:

copycode[2]

#include <iostream>   
using namespace std;  int add(int m,int n)  
{  int sum=0;  for(int i=m;i<=n;i++)  sum+=i;  return sum;  
}  void divide(int num)  
{  int i=1,j=2,flag;  int sum=0;  while(i<=num/2)  {  sum=add(i,j);  while(sum!=num)  {  if(sum>num)  i++;  else  j++;  sum=add(i,j);  }  for(int k=i;k<=j;k++)  cout<<k<<" ";  ++i;  cout<<endl;  }  
}  int main()  
{  int num;  cout<<"Please input your number:"<<endl;  cin>>num;  divide(num);  return 0;  
}  

copycode[3]

轉載于:https://www.cnblogs.com/wuyida/p/6301374.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273378.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IOS-C語言第12天,(函數指針)Point and macro(宏)

轉載于:https://www.cnblogs.com/xiangrongsu/p/4309366.html

c# 兩個數的加減乘除

Console.Title "加減乘除"; double x, y,z0; string m; int n0; Console.WriteLine("第一個數&#xff1a;"); x Convert.ToDouble(Console.ReadLine()); Console.WriteLine("運算符(默認為加)&#xff1a;"); m Console.ReadLine(); m (m &…

mysql建表語句

在sql語句中注意“約束的概念": 1.實體完整性約束(主鍵--唯一且非空) primary key()違約處理:No action(拒絕執行)2.參照完整性約束(外鍵約束)foregin key() references tableName(filedName) [on delete|update casecade | no action]違約處理:級聯更新或拒絕執行3.用戶自…

HTTP協議(1)—HTTP的連接

一、TCP連接過程:a.瀏覽器解析出主機名b.瀏覽器查詢出這個主機名的IP地址c.瀏覽器獲得端口號d.瀏覽器發起到ip:port的連接(TCP連接)e.瀏覽器向服務器發送一條HTTP報文f.瀏覽器從服務器讀取HTTP響應報文g.瀏覽器關閉連接1.TCP的可靠數據管道從TCP連接一端填入的字節會從另一端以…

Apache POI使用詳解

1.POI結構與常用類(1)POI介紹Apache POI是Apache軟件基金會的開源項目&#xff0c;POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 .NET的開發人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。(2)POI結構說明包名稱 說明HSSF 提供讀寫M…

Http協議(3)—HTTP實體和編碼

HTTP實體實現目標.可以被正確識別(通過Content-Type和Content-Launage).可以被正確解包(通過Content-Lenght首部和Content-Encoding首部).是最新的(通過實體驗證碼和緩存過期控制).符合用戶需要(基于Accept系列的內容協商首部).在網絡上可以快速有效的傳輸(通過范圍請求、差異編…

架構之美—軟件架構6大步驟(開篇)

1> 需求分析2> 領域建模3> 確定關鍵需求4> 概念架構設計5> 細化架構設計6 架構驗證 轉載于:https://www.cnblogs.com/kool/p/6695766.html

Http協議(2)—客戶端的識別與cookie機制

一、Http用戶識別的機制1.承載用戶身份的http首部2.客戶端IP地址跟蹤,根據客戶端IP地址進行識別3.用戶登錄,用認證方式識別用戶4.胖URL&#xff0c;一種在URL中嵌入識別信息的技術5.cookie,一種持久身份識別技術二、HTTP首部1.From包含用戶的Email地址2.User_Agent將用戶所用瀏…

經典PCB軟件比較闡述—Cadence和Mentor(整理)

PCB(Printed Circuit Board&#xff09;設計軟件經過多年的發展、不斷地修改和完善&#xff0c;或優存劣汰、或收購兼并、或強強聯合&#xff0c;現在只剩下Cadence和Mentor兩家公司獨大。 Cadence公司的推出的SPB(Silicon Package Board)系列&#xff0c;原理圖工具采…

RHEL 集群(RHCS)配置小記 -- 文檔記錄

1、RHEL 6 集群配置官方管理手冊 https://access.redhat.com/site/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/pdf/Cluster_Administration/Red_Hat_Enterprise_Linux-6-Cluster_Administration-zh-CN.pdf 2、官方講解Fencing設備原理 https://access.redhat.com/documen…

Http協議(5)—HTTP摘要認證

一、摘要認證的改進1.用摘要保護密碼客戶端不發送密碼,而是發送一個摘要&#xff0c;服務端只需驗證這個摘要是否和密碼相匹配2.單向摘要a.摘要是一種單向函數,將無限的輸入值轉化為有限的b.常見的摘要為MD5&#xff1a;將任意長度的字節序列轉換為一個128位的摘要;MD5的128位摘…

c#常用正則表達式

public class RegexUtil {private RegexUtil() { }private static RegexUtil instance null;/// <summary>/// 靜態實例化單體模式/// 保證應用程序操作某一全局對象&#xff0c;讓其保持一致而產生的對象/// </summary>/// <returns></returns>publi…

Http協議(4)—HTTP認證機制

一、認證1.HTTP質詢/響應認證框架服務器收到一條請求并沒有按照請求執行動作,而是以一個認證質詢執行響應,要求用戶提供一個保密信息說明他是誰,當用戶再次發送請求時要附上保密證書,如果證書匹配則執行請求,否則返回一條錯誤信息2.認證協議與首部官方的兩個認證協議:基本認證、…

C#加密解密DES字符串轉

using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.IO;namespace Component {public class Security{public Security(){ }//默認密鑰向量private static byte[] Keys { 0x12, 0x34, 0x56, 0x78, 0x90, …

Http協議(6)—安全HTTP

一、保護HTTP的安全1.功能:.服務器認證:客戶端知道它是在與真正的服務器進行通信.客戶端認證:服務器知道它是在與真正的客戶端進行通信.完整性:服務器與客戶端的數據不會被修改.加密:客戶端與服務器的對話是私密的,不會被竊聽.效率:運行足夠快的算法.普適性:所有客戶端和服務器…

restful處理

重寫/覆蓋 HTTP 方法 一些HTTP客戶端僅能處理簡單的的GET和POST請求&#xff0c;為照顧這些功能有限的客戶端&#xff0c;API需要一種方式來重寫HTTP方法. 盡管沒有一些硬性標準來做這事&#xff0c;但流行的慣例是接受一種叫 X-HTTP的請求頭&#xff0c;重寫是用一個字符串值…

Http協議(7)—Http緩存

一、冗余的數據傳輸有些客戶端訪問服務器頁面時,服務器會多次響應同一個頁面的副本給客戶端&#xff0c;這會產生冗余數據&#xff0c;故使用緩存就可以保留第一條相應的副本&#xff0c;以后就響應緩存的數據二、帶寬瓶頸在需要下載大型文件時,如果在局域網中放入該文件的一個…

Apache JMeter--網站自動測試與性能測評

Apache JMeter--網站自動測試與性能測評2013-02-28 15:48:05標簽&#xff1a;JmeterFrom:http://bdql.iteye.com/blog/291987 出于學習熱情&#xff0c;翻譯總結Emily H. Halili的《Apache JMeter》一書的部分內容。 JMeter的簡介 可以肯定的是&#xff0c;JMeter至少符合以下幾…

Linux 重命名文件

inux下重命名文件或文件夾的命令mv既可以重命名&#xff0c;又可以移動文件或文件夾. 例子&#xff1a;將目錄A重命名為B mv A B 例子&#xff1a;將/a目錄移動到/b下&#xff0c;并重命名為c mv /a /b/c 其實在文本模式中要重命名文件或目錄的話也是很簡單的&#xff0c;我們只…

苦逼的.net程序員, 轉行高富帥iOS移動開發

先知先覺,后知后覺 **- 在做了兩三年.net開發后, 還是感覺.net不是那么牛逼, 許多給我一起搞.net的同學, 不是去做了android, 就是去做了iOS, 或者java; 這讓我對.net的前景有了一些動搖, 在三思考之后,還是決定放棄.net ,理由很簡單,就是工資有點低; 由于藍鷗iOS培訓機構,一…