国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

深入理解約瑟夫環的數學優化方法

2020-01-26 16:09:56
字體:
來源:轉載
供稿:網友
首先,約瑟夫環的數學優化方法為:
為了討論方便,先把問題稍微改變一下,并不影響原意:問題描述:n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。
我們知道第一個人(編號一定是(m-1)%n) 出列之后,剩下的n-1個人組成了一個新的約瑟夫環(以編號為k=m%n的人開始):      k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2   并且從k開始報0。現在我們把他們的編號做一下轉換:
k --> 0   k+1 --> 1   k+2 --> 2
n-1 --> n-1-k     0--> n-k  
        ... ...   
k-3 --> n-3   k-2 --> n-2
序列1: 1, 2, 3, 4, …, n-2, n-1, n
序列2: 1, 2, 3, 4, … k-1, k+1, …, n-2, n-1, n
序列3: k+1, k+2, k+3, …, n-2, n-1, n, 1, 2, 3,…, k-2, k-1   
序列4:1, 2, 3, 4, …, 5, 6, 7, 8, …, n-2, n-1   
變換后就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是最終的勝利者,那么根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎?!!變回去的公式很簡單,相信大家都可以推出來:
∵ k=m%n;   
∴ x' = x+k = x+ m%n ; 而 x+ m%n 可能大于n
∴x'= (x+ m%n)%n = (x+m)%n   得到 x‘=(x+m)%n
如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解呢?當然是先求(n-3)的情況 ---- 這顯然就是一個倒推問題!好了,思路出來了,下面寫遞推公式:
令f表示i個人玩游戲報m退出最后勝利者的編號,最后的結果自然是f[n].
遞推公式:   f[1]=0;   f[i]=(f[i-1]+m)%i; (i>1)
完整的實現代碼如下:
復制代碼 代碼如下:

/*
約瑟夫環遞推公式:令f[i]表示i個人玩游戲報m退出最后勝利者的編號,最后的結果自然是f[n] 
遞推公式  f[1]=0;  f[i]=(f[i-1]+m)%i; (i>1)
*/
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
 int n, m,i, f[20]={0};
 scanf("%d %d",&n,&m);
    for(i=2;i<=n;i++)
 {
  f[i]=(f[i-1]+m)%i;
  printf("%d個人報數,報到%d的出列,最后的勝者下標為%d/n", i,m,f[i]);
 }
    printf("The winner is %d/n", f[n]+1);
 system("pause");
}

優化后的代碼為:
復制代碼 代碼如下:

#include "stdio.h"
#include "stdlib.h"
int main(void)
{
    int n, m,i, s=0;
 scanf("%d %d",&n,&m);
    for(i=2;i<=n;i++)
 {
  s=(s+m)%i;
 }
    printf("The winner is %d/n", s+1);
 system("pause");
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 长岭县| 曲麻莱县| 喀喇| 石嘴山市| 建阳市| 彰化市| 柏乡县| 绍兴县| 枞阳县| 定远县| 遂川县| 中西区| 滕州市| 英吉沙县| 安吉县| 威信县| 孝义市| 分宜县| 屏山县| 昌江| 利津县| 时尚| 疏勒县| 临城县| 安化县| 保康县| 老河口市| 胶南市| 惠来县| 灌南县| 南昌县| 沙雅县| 伊金霍洛旗| 田阳县| 盐池县| 龙山县| 乌海市| 咸阳市| 钟山县| 铜川市| 叶城县|