情報学オリンピックの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
コードは次のとおりです.
カンマを出力するかどうかを判断する方法は確かに愚かですが、私の方法を皆さんと共有します.
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;
}
カンマを出力するかどうかを判断する方法は確かに愚かですが、私の方法を皆さんと共有します.