问题 2111: 连环阵
生活随笔
收集整理的這篇文章主要介紹了
问题 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: 连环阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipad iphone开发_如何在iPh
- 下一篇: 深圳市威视爱普手术示教系统