python程序编写,python编程求素数
题目描述输入一个正整数N,用整数1,2,3,N作为一个环,使两个相邻整数之和为素数。Dqddp老师看到这个问题笑了:啊,戴上你的手表!
为了防止dqddp打表,吴老师决定这么做:
所有解按字典顺序排序后,从1开始编号,依次输出指定编号的K组解。最后一行中输出的场景总数。同一个质数环只能算一次。
第1行:输入两个整数,n(n=18)和k(1=k=10)
第2行:有k个整数从小到大排列,表示输出解的个数。
输出前k行,每行输出一组解,对应一个输入。
k 1行:表示方案总数的整数。
示例(如果复制到控制台时不带换行符,您可以将其粘贴到文本编辑器中并再次复制)
0 41 2 5 8样本输出1234765891012341098109856123867109867109867109867109413109867496样本描述提示输入:
1,2和10形成一个素环。按字典顺序输出1,2,5,8四组解。
输出示例描述:
第1、2、5和8组的解决方案是示例中列出的四行。有96套解决方案。
你一看这个质数就知道,首先要判断质数,进行预处理。
波尔潘[40];for(intI=2;i=39I)for(intj=2;j=sqrt(I;j)if(I % j==0){ pan[I]=true;黑色;}为什么只加工到39?
主题:n=18!
两个十八加起来是三十六。开到39号是为了避免越线。那样的话,处理速度会更快。不要每次都运行一次。
看问题:将所有解按字典顺序排序后,从1开始编号,然后依次输出K组指定编号的解。最后一行中输出的场景总数。同一个质数环只能算一次。
我的第一反应是用二维数组保存。
但是再想想,在极限处,n=18有上万种可能。会不会出格?初衷一定是不储存自己的可能性。另外,我还看到了“第二行:从小到大依次有K个整数,表示输出解的个数”的主题。我觉得很开心,就用数组反复保存,达到要求的行数后输出,避免了中转。
不过因为不知道后面发生了什么,还是有几个细节没有改变。
注释了以下所有错误内容:
# include CST dio # includecmathintn,k,a[20],s [ 20 ]={ 0,1 },num,ii;oo LFG [ 20 ]={ 0,1 },潘[40];//是否已经使用//fg,pan为素数,false为素数,true为素数void print());for(intI=1;在;I ) printf(%d ,s[I];printf(%d(n),s[n];} void TT(intx)for)intI=2;I=n;我)如果(!fg[i]!pan[Is[x-1]} { s[x]=I;fg[I]=true;If(把x==n/*写成i*/) if(!Pan[s[x]/*按照s[i]*/s[1]] num==a[ii 1]/*的顺序反过来写。*/)print((TT)x1;判断条件是否满足后;fg[I]=false;}}int main () Scanf ) ) %d%d),n,k);for(intI=2;i=39I)for(intj=2;j=sqrt(I;j)if(I % j==0){ pan[I]=true;黑色;} for(intI=1;I=k;I ) scanf(%d ,a[I];TT(2;printf(%d ,num);0;}
一个多小时终于修好了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。