1. 程式人生 > >UVA:133 救濟金的發放

UVA:133 救濟金的發放


思路:過程模擬,模擬每一次選中出局的操作,知道最後沒有人時。

注意:1、避免進行陣列的刪除可以使用將刪除的數字置為0 

         2、對環的操作是個難點,如何實現線性陣列首尾相連構成環,需要注意陣列的下標問題

         3、計算選中的人的數時,需要注意我們使用0代表出局的人,所以數到0時代表該位置為空不應該算數,需要數到非零時才算數

         4、輸出格式也是個注意事項,個位數輸出兩個空格,十位數輸出一個空格(presentation error輸出格式錯誤

#include <stdio.h>
#include <iostream>
using namespace std;
//成功
int n,k,m;
int size;
int number(int *a,int r,int a1,int b,int k1,int m1){//用來計算下一個需要踢出的位置
    if(a1==1){//a時
        do{
            r++;
            if(r>=n)r=r-n;
            if(r<=0)r=r+n;
            if(a[r]!=0)//只有當前有人的時候計數才有用,為0時計數沒用
            {
                k1--;
            }
            
        }while(k1>0);
        return r;
    }else{//b時
        do{
            r--;
            if(r>=n)r=r-n;
            if(r<=0)r=r+n;
            if(a[r]!=0)
            {
                m1--;

            }
            
        }while(m1>0);
        return r;
    }
    return r;
}
void test(){
    int a[n+2];
    for(int i=0;i<=n+1;i++){
        a[i]=i;
    }
    a[0]=-1;
    int ra=0,rb=n+1;
    while(size>0){
        ra=number(a,ra,1,0,k,0);//計算a和b的下一個數字
        rb=number(a,rb,0,1,0,m);
    if(ra==rb){//如果a和b指向同一個人
        if(a[ra]>=10)cout<<" ";
        else cout<<"  ";
        cout<<a[ra];
        a[ra]=0;
        size--;
    }else{//a和b指向不同人時分別剔除
        if(a[ra]>=10)cout<<" ";//十位數字時輸出一個空格,個位數字輸出兩個空格
        else cout<<"  ";
        cout<<a[ra];
        a[ra]=0;
        size--;
        if(a[rb]>=10)cout<<" ";
        else cout<<"  ";
        cout<<a[rb];
        size--;
        a[rb]=0;
    }
        if(size>0)//最後一個不輸出逗號
        cout<<",";
    }
    
}
int main(){
    cin>>n>>k>>m;
    while(n!=0){//不為0時輸入
        size=n;
        test();
        cout<<endl;
        cin>>n>>k>>m;
    }
}