1. 程式人生 > >C語言實現整數劃分問題

C語言實現整數劃分問題

1、題目描述:輸入一個正數n,輸出所有和為n連續正數序列。

例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。

思路:

等差數列是常見數列的一種,如果一個數列從第二項起,每一項與它的前一項的差等於同一個常數,這個數列就叫做等差數列,而這個常數叫做等差數列的公差,公差常用字母d表示。例如:1,3,5,7,9……1+2(n-1)。等差數列的通項公式為:an=a1+(n-1)d (1)前n項和公式為:或Sn=n(a1+an)/2=[a1+a1+(n-1)d]* n/2=a1 n+ n (n-1)d /2.。注意: 以上n均屬於正整數

本題中已知Sn=n, 公比d =1,首項末項都不知道。為了方便得知首項,將遍歷臨時變數取值。

int  sumNBySequence(int Sn)
{
      int a1,an,temp,n;

         for(n = 2; n*n <= 2*Sn; n++ )//等差公式 n(2a1+(n-1)*d)= 2Sn。其中d = 1。n首先是2Sn的因子 
         {
              temp = 2*Sn -n*n+n;//等差公式變形為:2na1+n*n-n = 2Sn  
              if(temp%(2*n) == 0) 
              {
              a1 = temp/(2*n);
              an = a1+ n-1;
              printf("%d,%d",a1,an);
              }
              printf("\n"); //空行表示該n求不得a1和an 
        }
   return 0; 
 }
     int  main ()
     {
         sumNBySequence(30000);
         return 0;
     }

演算法設計與分析 王曉東 p22
2、整數劃分問題

將正整數n表示成一系列正整數之和,n=n1+n2+…+nk,其中n1>=n2>=…>=nk>=1k>=1正整數n的這種表示稱為正整數n的劃分。正整數n的不同的劃分個數稱為正整數n的劃分數,記作p(n)例如正整數6有如下11種不同的劃分,所以p(6)=11
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1.

思路:

      注意6=1+5 和 6=5+1被認為是同一個劃分。在正整數n所有不同的劃分中,將最大加數

n1不大於m的劃分個數記作f(n,m),稱它為屬於n的一個m劃分

       該問題是求出n的所有劃分個數,即f(n, n)。下面我們考慮求f(n,m)的方法;

        根據n和m的關係,考慮以下幾種情況: 

      (1)當n=1時,不論m的值為多少(m>0),只有一種劃分即{1};

        (2)  當m=1時,不論n的值為多少,只有一種劃分即n個1,{1,1,1,...,1};

        (3)  當n=m時,根據劃分中是否包含n,可以分為兩種情況:

              (a). 劃分中包含n的情況,只有一個即{n};

              (b). 劃分中不包含n的情況,這時劃分中最大的數字也一定比n小,即n的所有(n-1)劃分。

              因此 f(n,n) =1 + f(n,n-1);

        (4) 當n<m時,由於劃分中不可能出現負數,因此就相當於f(n,n);

        (5) 但n>m時,根據劃分中是否包含最大值m,可以分為兩種情況:

               (a). 劃分中包含m的情況,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和為n-m,可能再次出現m,因此是(n-m)的m劃分,因此這種劃分

                     個數為f(n-m, m);

               (b). 劃分中不包含m的情況,則劃分中所有值都比m小,即n的(m-1)劃分,個數為f(n,m-1);

              因此 f(n, m) = f(n-m, m)+f(n,m-1);

          綜合以上情況,我們可以看出,上面的結論具有遞迴定義特徵,其中(1)和(2)屬於迴歸條件,(3)和(4)屬於特殊情況,將會轉換為情況(5)。而情況(5)為通用情況,屬於遞推的方法,其本質主要是通過減小m以達到迴歸條件,從而解決問題。其遞推表示式如下:

         f(n, m)=       1;                                (n=1 or m=1)

                            f(n, n);                         (n<m)

                            1+ f(n, m-1);                (n=m)

                            f(n-m,m)+f(n,m-1);       (n>m)

int Part(int n, int m)

{

    if ((n < 1)||(m < 1))

        return 0;

    if ((n == 1)||(m == 1))

        return 1;

    if (n < m)

        return Part(n, n);

    if (n == m)

        return Part(n, m-1) + 1;

    return Part(n, m-1) + Part(n-m, m);

} 
     int  main ()
     {
         Part(6,6);
     }



相關推薦

C語言實現整數劃分問題

1、題目描述:輸入一個正數n,輸出所有和為n連續正數序列。 例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。 思路: 等差數列是常見數列的一種,如果一個數列從第二項起,每一項與它的前一項的差等於同一個常數,這個數

C語言實現整數反轉-簡練演算法

今天做實驗題  實現整數反轉用了pow函式,把自己坑了,pow返回值是double型,而程式中的變數全是int型。 之後知道了不用pow函式的方法,特此記錄。 思路: 先求出n的位數用i記錄,之後再加

C語言整數劃分問題 遞迴和遞推

對於一個正整數n的劃分,就是把n變成一系列正整數之和的表示式。注意,分劃與順序無關,例如6=5+1跟6=1+5是 同一種分劃。另外,單獨這個整數本身也算一種分劃。 例如:對於正整數n=5,可以劃分為: 1+1+1+1+1 1+1+1+2 1+1+3 1+2+2 2+3 1+4 5 輸入描述 輸入一個正整

C語言實現整數四則運算表示式的計算

一、問題重述 【問題描述】 從標準輸入中讀入一個整數算術運算表示式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。計算表示式結果,並輸出。 要求: 1、表示式運算子只有+、-、*、/,表示式末尾的’=’字元表示表示式輸入結束,表示式中可能會出現空格; 2、

C語言實現整數的通用進位制轉換

/* * 檔名:baseConvert.c * 功能描述:實現將10進位制整數轉換為進位制大於1的數 * 編輯人:王廷雲 * 編輯日期:2017-1-1 */ #include <stdi

整數劃分C語言實現

指把一個正整數n寫成多個大於等於1且小於等於其本身的整數的和,則其中各加數所構成的集合為n的一個劃分。這是一個典型的遞迴演算法。 所謂整數劃分,是指把一個正整數n寫成為 其中, 為正整數,並且 ; 為n的一個劃分。 如果 中的最大值不超過m,即 ,則

二十四進制編碼串轉換為32位無符號整數C語言實現

bool while open 參數錯誤 hint div 第一個字符 bsp opened typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff

整數相加 a+b 的c語言實現

pos -i += 有意義 size 大整數 int max 輸入 終於來到我所期盼的高精度整數相加的題目了。這個題很經典,也算是一個很好的算法入門題吧。 如果是java的話,系統類庫已經內置了BigInteger類,直接調用就可以很輕易地解決了。但是學習c的編寫也是非常有

C語言實現 兩個int(32位)整數m和n的二進位制表達中,有多少個位(bit)不同?

輸入例子: 1999 2299 輸出例子:7 int main() { int a = 0; int b = 0; int num = 0; int count = 0; printf("請輸入兩個整數:"); scanf("%d%d",&a,&b); n

整數的四則運算(C語言實現)(2)——大整數的加法和減法運算

斷斷續續調了好久個演算法的程式碼終於除錯好了,廢話不多說了,直接說思路,然後上程式碼。上一篇文章介紹了大整數的輸入的處理,包括接收方式、儲存方式、前導零的處理等內容。本文接著上一篇的內容。簡述大整數加減運算的思路。首先對於加法運算,存在以下四種情況:             

c語言實現將一個整數轉換為字串

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

關於C語言大正整數相加的實現

大家好,我是一名剛接觸c語言不久的大一新生,這是我的第一篇部落格:關於大正整數的加法 我們都知道整型變數即使是長整型表示數字的範圍也非常有限,因此我們可以用字元陣列儲存大正整數,然後模擬手工運算實現兩個大整數的加法。 簡單思路為:將兩個大正整數存入字元陣列

C/C++語言實現十進位制正整數轉化為2-16進位制的數並輸出

<h3>/<span style="font-size:18px;">/將一個十進位制的正整數轉化為H進位制並輸出--拓展 在此先研究對於正整數的進位制轉換 以及2-16的進位制與十進位制的轉換 #include <IOSTREAM> using namespace s

C#實現整數劃分問題——帶輸出

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _2_2 {            classProgram          

C語言實現判斷一個整數可被3 5 7中哪些數字整除

題目來源:大工慕課 連結 作者:Caleb Sung 注意事項 重點在於if, else if, else的巢狀與混合使用,因而寫法其實並不固定,達成設計目的即可。 解答示範

C語言實現只用加法和減法實現兩個正整數的乘除運算

1、乘法a*b如下 #include<stdlib.h> #include<stdio.h> int main() { int a,b; int i,result=0; scanf("%d%d",a,b); for(

【原始碼】將一個整數的每位數分解並按逆序放入一個數組中(用遞迴演算法)(C語言實現)

幫朋友做的,好像是一個面試題。如果僅僅是考察遞迴的話,應該是夠了,程式的健壯性和通用性都很一般的說…… #include <stdio.h> #include <stdlib.h&g

c語言實現整數轉為字串和字串轉為整數

整數轉為字串:數字+‘0’=相應字元 /***********************************************整數轉為字串**********************************************/ #inclu

力扣992.K個不同整數的子陣列-C語言實現

## 題目 [原題連結](https://leetcode-cn.com/problems/subarrays-with-k-different-integers) 給定一個正整數陣列 A,如果 A 的某個子陣列中不同整數的個數恰好為 K,則稱 A 的這個連續、不一定獨立的子陣列為好子陣列。 (例如,[1,

遺傳算法的C語言實現(二)

print 比較 詳細 author 當前 cross max r+ 訪問 上一次我們使用遺傳算法求解了一個較為復雜的多元非線性函數的極值問題,也基本了解了遺傳算法的實現基本步驟。這一次,我再以經典的TSP問題為例,更加深入地說明遺傳算法中選擇、交叉、變異等核心步