第二次組隊賽——B
阿新 • • 發佈:2018-12-24
n個人站成一行玩一個報數遊戲。所有人從左到右編號為1到n。遊戲開始時,最左邊的人報1,他右邊的人報2,編號為3的人報3,等等。當編號為n的人(即最右邊的人)報完n之後,輪到他左邊的人(即編號為n-1的人)報n+1,然後編號為n-2的人報n+2,以此類推。當最左邊的人再次報數之後,報數方向又變成從左到右,依次類推。
為了防止遊戲太無聊,報數時有一個特例:如果應該報的數包含數字7或者是7的倍數,他應當用拍手代替報數。下表是n=4的報數情況(X表示拍手)。當編號為3的人第4次拍手的時候,他實際上數到了35。
給定n,m和k,你的任務是計算當編號為m的人第k次拍手時,他實際上數到了幾。
Input
輸入包含不超過10組資料。每組資料佔一行,包含三個整數n,m和k(2<=n<=100, 1<=m<=n, 1<=k<=100)。輸入結束標誌為n=m=k=0。
Output
對於每組資料,輸出一行,即編號為m的人第k次拍手時,他實際上數到的那個整數。
Sample Input
4 3 1 4 3 2 4 3 3 4 3 4 0 0 0
Sample Output
17 21 27 35
我做了好幾次,都錯了,錯的原因是每次都考慮的不全面,總是落下某個因素沒考慮到。
於是可以用個for迴圈,一開始讓y=m. 當i為奇數時,y=y+2*(n-m)。
可是我並沒有考慮到m=7或者m包含數字7的情況。所以一直WA。其次還沒有考慮m=1和m=n的情況。當m=n.那麼每個m之間都是間距 2*(m-1)。當m=1.每個m之間都是間距 2*(n-1)。
#include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> using namespace std; bool ok(long long y) { if(y%7==0) { return 1; } else { long long hh=y; if(hh%10==7) { return 1; } else { while(hh!=0) { hh/=10; if(hh%10==7) { return 1; } } return 0; } } } int main() { int n,k; long long m; while(cin>>n>>m>>k,n,m,k) { if(m>n||k>100||k<=0||n>100||n<2||m<1) break; bool ff=0; long long y=m,num=0; if(ok(m)) { num++; if(num==k) { cout<<m<<endl; continue; } } if(m==n||m==1) { long long ho=m; while(num!=k) { ho=ho+2*(n-1); if(ok(ho)) num++; } cout<<ho<<endl; } else { while(num!=k) { for(int i=1;; i++) { if(i%2==1) { y=y+2*(n-m); } else { y=y+2*(m-1); } if(ok(y)) { num++; } if(num==k) { // cout<<y<<endl; // ff=1; break; } } } cout<<y<<endl; } } }