1 条题解

  • 0
    @ 2025-4-7 21:41:58

    C++ :

    #include <iostream>
    using namespace std;
    int josephus(int n,int k,int m,int p){
    	int r = 0;
    	for(int i=n-p+1;i<=n;i++)
    		r = (r+k-1)%i+1;
    	return (r+m-k%n-1+n)%n+1;}
    int main(){
    	for(int n,k,m,p;cin>>n>>k>>m>>p && !(n+m+k+p == 0);)
    		cout<<josephus(n,k,m,p)<<endl;
    	return 0;}
    

    Java :

    import java.util.*;
    public class Main {
    		static ArrayList<Integer> list =null;
    		private static Scanner in;
    		
    		public static void main(String[] args) {
    			
    			 in = new Scanner(System.in);
    			 int n,k,m,p,a,c,count,temp=0,x=0;
    			while(in.hasNext()){
    				count=1;
    				x=0;
    				n=in.nextInt();
    				k=in.nextInt();
    				m=in.nextInt();
    				p=in.nextInt();
    				if(n==0&&k==0&&m==0&&p==0) break;
    				list = new ArrayList<Integer>();
    				creatList( n);
    				if(m%n==0)
    					m=n-1;
    	            else
    	                m=m%n-1;
    
    				if(count==p){
    					System.out.println(list.get(m));
    					continue;
    				}
    				list.remove(m);
    				
    				while(list.size()!=1){
    					if(list.size()-m>k){
    						temp = list.get(m+k-1);
    						list.remove(m+k-1);
    						count++;
    						m=m+k-1;
    					}else if(list.size()-m<k){
    						c=k-(list.size()-m);
    						a=0;
    						while(true){
    							if(a+c<list.size()){
    								temp = list.get(a+c-1);
    								list.remove(a+c-1);
    								count++;
    								m=a+c-1;
    								break;
    							}
    							else if(a+c>list.size()){
    								c=c-(list.size()-a);
    								a=0;
    							}else{
    								temp = list.get(a+c-1);
    								list.remove(a+c-1);
    								count++;
    								m=0;
    								break;
    							}
    								
    						}
    					}else {
    						temp = list.get(list.size()-1);
    						list.remove(list.size()-1);
    						count++;
    						m=0;
    					}
    					if(count==p){
    						System.out.println(temp);
    						x=1;
    						break;
    					}
    				}
    				if(list.size()==1&&x==0)
    					System.out.println(list.get(0));
    				
    			}
    		}
    		public static void creatList(int n){
    			for(int i=1;i<=n;i++){
    				list.add(i);
    			}
    			
    		}
    }
    
    • 1

    圆圈报数(II)(输出第几个出队的人)

    信息

    ID
    2134
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者