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

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

生活随笔

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

编程问答

素数环 与 算法 全排列

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 素数环 与 算法 全排列 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在說(shuō)起全排列前,先說(shuō)一下昨天碰到的一個(gè)題目(答案不是我做出來(lái)的,但是我感覺(jué)有好多個(gè)亮點(diǎn),貼出來(lái)方便日后的學(xué)習(xí)):

?

素?cái)?shù)環(huán)

時(shí)間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:2 描述

有一個(gè)整數(shù)n,把從1到n的數(shù)字無(wú)重復(fù)的排列成環(huán),且使每相鄰兩個(gè)數(shù)(包括首尾)的和都為素?cái)?shù),稱為素?cái)?shù)環(huán)。

為了簡(jiǎn)便起見,我們規(guī)定每個(gè)素?cái)?shù)環(huán)都從1開始。例如,下圖就是6的一個(gè)素?cái)?shù)環(huán)。

輸入
有多組測(cè)試數(shù)據(jù),每組輸入一個(gè)n(0<n<20),n=0表示輸入結(jié)束。
輸出
每組第一行輸出對(duì)應(yīng)的Case序號(hào),從1開始。
如果存在滿足題意敘述的素?cái)?shù)環(huán),從小到大輸出。
否則輸出No Answer。
樣例輸入
6 8 3 0
樣例輸出
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 Case 3: No Answer








這個(gè)題的解法我考慮了很久,怎么說(shuō)呢,感覺(jué)上并不是一道難度很大的題,實(shí)際操作起來(lái)卻又無(wú)從下手。我說(shuō)一下我的思考過(guò)程
首先,這牽扯到尋找素?cái)?shù),但是呢,不是簡(jiǎn)單的找素?cái)?shù),而是兩個(gè)數(shù)的和,在[1,n]之間的兩個(gè)數(shù)m,n的和

        有多組測(cè)試數(shù)據(jù),每組輸入一個(gè)n(0<n<20),n=0表示輸入結(jié)束。

這句話可以看出輸入的n,最大,也就20.那么,即使在跑程序的時(shí)候,當(dāng)真輸入為20,最大的的一個(gè)和值也就是20+20=40,那么,我完全可以把[1,40]間的素?cái)?shù)全部找出來(lái)并建立一個(gè)數(shù)
組s[40],然后在[1,n]間查看,看哪兩個(gè)數(shù)的和是素?cái)?shù),通過(guò)在數(shù)組s[40]里查找是否符合,若符合,將符合的值存放在一個(gè)數(shù)組里,而后輸出。 #include <stdio.h> #include<string.h> int count,sa[40]; // coount 用于控制輸出流 sa[]是一個(gè)用來(lái)顯示區(qū)間[2,42]內(nèi)每個(gè)數(shù)是否為素?cái)?shù)的數(shù)組,若為素?cái)?shù),其對(duì)應(yīng)的sa[j]=1/*** found 函數(shù)的定義,據(jù)作者說(shuō)是由全排列改編過(guò)來(lái)的 ***/ void found(int n,int cur,int a[],int flag[]){ // 傳入的 n 為 in[]數(shù)組中的元素,即輸入值; cur 初始值為1 是用于控制a[]的下標(biāo) ; a[]是一個(gè)a[0]=1的用于存放可滿足數(shù)的數(shù)組; // flag[]是一個(gè)初始值全部置0的數(shù)組 , 用于儲(chǔ)存在判定檢查過(guò)程中的數(shù)是否為要用的值后的布爾值if(cur==n&&sa[a[0]+a[cur-1]]) // 這里用cur 與 輸入值 n 進(jìn)行比較判斷 也就是說(shuō) a數(shù)組里存放的個(gè)數(shù)最多 n個(gè),最多把[1,n]之間的值全部放進(jìn)去,或者說(shuō)數(shù)組a里的最大值肯定不能大于n { { for(int i=0;i<n;i++) printf("%d ",a[i]); // 那么,當(dāng)a數(shù)組檢查n是否可以存放時(shí),這次遍歷也就到此結(jié)束了,也就是該輸出數(shù)組a了putchar('\n'); count=0; } } /***** 在cur!=n時(shí),需要進(jìn)一步的檢查時(shí),利用遞歸,在區(qū)間[2,n],以此將滿足的數(shù)存放在a[]中 *****/else // for(int i=2;i<=n;i++) // if(!flag[i]&&sa[i+a[cur-1]]) // { // a[cur]=i; // flag[i]=1; // found(n,cur+1,a,flag); // flag[i]=0; // } // } // /*********************************************************************************/ int main(void) {int i=0,a[20],in[100],flag[20]; // in[20] 用于存放輸入 memset(sa,0,sizeof(sa)); memset(flag,0,sizeof(flag)); /***********************************************************/ for(int ok=1,k=2,j=2;j<40;j++,ok=1) // { // for(int i=2;i<=j/2;i++) // 在區(qū)間[2,40]里進(jìn)行是否為素?cái)?shù)的判定 用j控制數(shù)組sa的下標(biāo),同時(shí),j還是一個(gè)數(shù)列【2,,40】 { // if(j%i==0) ok=0; // 若為素?cái)?shù),sa[j]=1,否則不對(duì)sa[j]處理,即為0 } // if(ok) sa[j]=1; // } // /**************************************************/ /**************************************/do // 我很喜歡這段控制輸入的代碼{ // scanf("%d",&in[i++]); // 很簡(jiǎn)單 但是很巧妙 }while(in[i-1]); // /********************************/// 大方 優(yōu)雅 a[0]=1; for(int j=1;j<i;j++) {count=1; printf("Case %d:\n",j); // j 顯示輸入的數(shù)據(jù)的個(gè)數(shù) if(!(in[j-1]%2)||in[j-1]==1) found(in[j-1],1,a,flag); // if里判定 in[]數(shù)組里的元素是否為奇數(shù) 或者是為1 兩種情況均調(diào)用函數(shù) if(count) printf("No Answer\n"); } return 0; }

?

?

?先簡(jiǎn)單簡(jiǎn)單注釋一下,可能在匆忙之中有一些錯(cuò)誤,哪位有發(fā)現(xiàn),多謝指出

?

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

總結(jié)

以上是生活随笔為你收集整理的素数环 与 算法 全排列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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