日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【编程练习】正整数分解为几个连续自然数之和

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【编程练习】正整数分解为几个连续自然数之和 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

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

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

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; } } }

第二個(gè)問(wèn)題是什么樣的數(shù)可以寫(xiě)成連續(xù)n個(gè)自然數(shù)之和,什么樣的數(shù)不能?

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

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

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

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

    參考代碼:

    #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; }

    轉(zhuǎn)載于:https://www.cnblogs.com/wuyida/p/6301374.html

    總結(jié)

    以上是生活随笔為你收集整理的【编程练习】正整数分解为几个连续自然数之和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。