情報学オリンピックの1冊の通c++言語--1109:明かりをつける

6628 ワード

【題名説明】N個のランプ(Nは5000以下の正の整数)があると仮定し、1からNまで順番に番号付けし、初期時には全てオン状態とする.M個人(MはN以下の正の整数)も1からMまで順次番号付けされる.
1人目(1番)はすべて消灯し、2人目(2番)は2の倍数のランプを点灯し、3人目(3番)は3の倍数のランプを逆処理(間もなく点灯するランプは消灯し、消灯するランプは点灯する).番号の増加順に従って、以降の人は3番と同じように、自分の番号の倍数のランプを逆処理します.
すみません、M番目の個人が操作した後、どのランプがオフになっているか、小さいものから大きいものまで番号を出力し、その間にカンマで間隔を置きます.
【入力】正の整数NとMを1つのスペースで区切って入力します.
【出力】閉じたランプの番号を順番に出力し、その間をカンマで区切る.
【入力サンプル】10【出力サンプル】1,4,9
コードは次のとおりです.
#include
using namespace std;
int main()
{    
    int n,m;
    cin>>n>>m;
    bool a[n+1]; //         
    int t=0,b=1; //t        ,b    
    memset(a,true,sizeof(a)); //         
    for(int i=1;i<=m;i++) //m      
    {
    	for(int j=i;j<=n;j++) //  
    	{
    		if(j%i==0) //       
    		    a[j]=!a[j]; //     
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]==false) //        
		    t++;    
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]==false) //  
		{
			if(b==t) //      
                cout<<i; //     
            else
                cout<<i<<","; //       
            b++;
		}		
	}
    return 0; 
}

カンマを出力するかどうかを判断する方法は確かに愚かですが、私の方法を皆さんと共有します.