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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

问题 2111: 连环阵

發布時間:2024/3/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 问题 2111: 连环阵 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:https://www.dotcpp.com/oj/problem2111.html
題目來源:C語言網

題目描述
?? 杰洛特主動出擊狂獵的老巢,然而在此之前,他遇到了一個女術士,杰洛特想要女術士助自己一臂之力,她卻出了一個難題給杰洛特,只有答對了才能與他同行
??女術士給杰洛特一個四位數的素數,要求他說出這個四位數的數字的另外兩個四位素數(從小到達輸出),要求:
??1.這個三個四位數組成等差數列
??2.這三組數字的構成相同(即每個四位數都是其他數字的一種排列)
輸入
??多組數據輸入
?? ??每次一個整數
輸出
??輸出這三個數字,如果沒有達成條件的三個數字,則輸出"No"
樣例輸入
??4817
??1232
樣例輸出
??1487 4817 8147
??No

??首先是題目的問題,此題并沒有保證輸入的四位數是素數(坑死…);對于這個題目我先預處理出來每個數是否是素數(埃式篩法),對于 n n n 先找出所有的排列( next_permutation() ),將其存入一個素數的數列當中(這里有一個坑點,有前導零的數字不算是四位素數…),首先判斷 n n n 是否為素數,如果不是直接輸入 N o No No,如果是素數就按照 n n n 在左邊,中間和右邊分別取枚舉,如果存在滿足條件的數列則輸出,否則輸出 N o No No

#include<bits/stdc++.h> using namespace std;const int maxn=1e5+10; bool is_prime[maxn]; int a[maxn],prime[maxn];void isPrime(){for(int i=2;i<=maxn;i++) is_prime[i]=true;is_prime[0]=is_prime[1]=true;for(int i=2;i<=sqrt(maxn);i++){if(is_prime[i]){for(int j=i*i;j<=maxn;j+=i)is_prime[j]=false;}} }int main(){isPrime();/*string str="1222";do{cout<<str<<endl;}while(next_permutation(str.begin(),str.end()));*/int n;while(~scanf("%d",&n)){/*for(int i=1000;i<=9999;i++){//if(is_prime[i]) n=i;//else continue;n=i;cout<<n<<" : ";*/int x=n,cnt=0;while(x){a[cnt++]=x%10;x/=10;}sort(a,a+4); cnt=0;do{int temp=a[0]*1000+a[1]*100+a[2]*10+a[3];if(is_prime[temp]&&temp>=1000) prime[cnt++]=temp;}while(next_permutation(a,a+4));//for(int i=0;i<cnt;i++) cout<<prime[i]<<" "; cout<<endl;//3種情況,n在左邊,n在中間,n在右邊if(!is_prime[n]) puts("No");else{int inx=lower_bound(prime,prime+cnt,n)-prime;//n的位置int a=0,b=0,c=0; for(int i=0;i<inx;i++){//<n的情況 if(binary_search(prime,prime+cnt,n+n-prime[i])){//n在中間 a=prime[i]; b=n; c=n+n-prime[i];break;}if(binary_search(prime,prime+cnt,(n+prime[i])/2)){//n在右邊a=prime[i]; b=(n+prime[i])/2; c=n;break; }} for(int i=inx+1;i<cnt;i++){//>n的情況if(binary_search(prime,prime+cnt,n-(prime[i]-n))){//n在中間a=n-(prime[i]-n); b=n; c=prime[i];break; } if(binary_search(prime,prime+cnt,(n+prime[i])/2)){//n在左邊a=n; b=(n+prime[i])/2; c=prime[i];break; }}if(a&&b&&c) printf("%d %d %d\n",a,b,c);else puts("No");}//}//}return 0; }

總結

以上是生活随笔為你收集整理的问题 2111: 连环阵的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。