程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 應用簡練的C說話代碼處理跳台階成績與約瑟夫環成績

應用簡練的C說話代碼處理跳台階成績與約瑟夫環成績

編輯:關於C++

應用簡練的C說話代碼處理跳台階成績與約瑟夫環成績。本站提示廣大學習愛好者:(應用簡練的C說話代碼處理跳台階成績與約瑟夫環成績)文章只能為提供參考,不一定能成為您想要的結果。以下是應用簡練的C說話代碼處理跳台階成績與約瑟夫環成績正文


跳台階成績

標題:

一個台階總共有 n 級,假如一次可以跳 1 級,也能夠跳 2 級。

求總共有若干總跳法,並剖析算法的時光龐雜度。

剖析:

也是比擬基本的標題,經由過程遞歸可以便利的求解

代碼完成以下(GCC編譯經由過程):

#include "stdio.h"
#include "stdlib.h"
 
int function(int n);
 
int main(void)
{
  int tmp;
   
  tmp = function(5);
  printf("%3d\n",tmp);
 
  return 0;
}
 
int function(int n)
{
  if(n == 1)
    return 1;
  else if(n == 2)
    return 2;
  else  
    return function(n-1) + function(n-2);
}


約瑟夫環成績
標題:

n個數字(0,1,…,n-1)構成一個圓圈,從數字0開端,每次從這個圓圈中刪除第m個數字(第一個為以後數字自己,第二個為以後數字的下一個數字)。當一個數字刪除後,從被刪除數字的下一個持續刪除第m個數字。求處在這個圓圈中剩下的最初一個數字。

(其實說了這麼多就是約瑟夫環成績)

剖析:

之前進修鏈表的時刻也見過約瑟夫環成績,其時是拿輪回鏈表模仿全部進程來處理的,明天在網上看到一種剖析。記載上去:

    標題請求最初剩下的一個數(用last表現),也就是這個數是第幾個,在(0,1,…,n-1)的地位是若干。明白了標題中的信息,所以我們要對這個數停止歸結。假定曉得這個數在剩下的k個數中的地位,怎樣來求得它在殘剩K+1個數中的地位,如許一步一步推導出它在有n個數中的地位,即為所求。為何能如許歸結,由於這個最初剩下的數在一切刪除進程中有幸存活上去,只不外每次刪除一個數,它的地位就變了,曉得最初,它的地位為0(只剩一個數了)。

如今來剖析刪除第一個數後,last這個數的地位已之前有甚麼樣的關系。在這n個數字中,第一個被刪除的數字是(m-1)%n,為簡略起見記為k。那末刪除k以後的剩下n-1的數字為0,1,…,k-1,k+1,…,n-1,而且下一個開端計數的數字是k+1。相當於在剩下的序列中,k+1排到最後面,從而構成序列k+1,…,n-1,0,…k-1。

k+1    ->    0
k+2    ->    1

n-1    ->    n-k-2
0       ->    n-k-1

k-1   ->   n-2

如今我們曉得了有n-1個數時last的地位,記為f(n-1,m),那末若何來求得f(n,m)關於f(n-1,m)之間的關系?用X,Y來表現,以下:

Y              X

k+1    ->    0
k+2    ->    1

n-1    ->    n-k-2
0       ->     n-k-1

k-1    ->    n-2

y=( x+k+1) %n

k = (m-1)%n

所以y=(x+m)%n,終究關系以下:

                0                              n=1
f(n,m)={
                [f(n-1,m)+m]%n     n>1

依據關系可以很便利的獲得代碼

代碼完成以下:

int LastRemaining(int n, int m)
{
  if(n < 1 || m < 1)
    return -1;
 
  int last = 0;
  for (int i = 2; i <= n; i ++) 
    last = (last + m) % i;
 
  return last;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved