C++做智力题

来源:百度知道 编辑:UC知道 时间:2024/05/16 05:14:38
/************************************************************************/
/* 有123456名士兵。长官让报数,并让数双数的士兵站出来。 */
/* 之后再报数,数双数的士兵再站出来……以此类推…… */
/* 最后只剩下一名士兵。问:这名士兵最开始的时候是第几个? */
/************************************************************************/

#include<iostream>
using namespace std;
const int n=10;//士兵人数

int main()
{
int r[n];//储存士兵,并进行操作
int t[n];//原始士兵,为以后对照
int a=1;
int b=1;
int s=n;//计数
int k=0;

for(int i=0; i<n; i++)//为两个相同数组赋值
{
r[i]=a;
t[i]=a;
a++;
}

do
{
for(int i=0; i<n; i++)//用 -1 标记每次报单数的人
if(r[i]%2 != 0) r[i]=-1;
for(int j=0; j<n; j++)//重新报数
{
if(r[j] != -1) r[j]=b;
b++;
}
for(int l=0; l<n; l++)
if(r[l] == -1) s--;//减去报单数的人 <

LZ还是换个思路把,反过来做简单些,结果应该时2^k。。。
这样做就行了,编译通过
#include<iostream>
using namespace std;
main()
{
int s=1,n;
cout<<"请输入士兵个数:"<<endl;
cin>>n;
while(s*2<=n)
{
s*=2;
}
cout<<s<<endl;
}

改了下LZ的
#include<iostream>
using namespace std;
const int n=10;

int main()
{
int r[n];
int t[n];
int a=1;
int b=1;
int s=n;
int k=0;

for(int i=0; i<n; i++)
{
r[i]=a;
t[i]=a;
a++;
}

do
{
for(int i=0; i<n; i++)
if(r[i]%2 != 0) r[i]=-1;
b=1;
for(int j=0; j<n; j++)
{
if(r[j] != -1)
{r[j]=b;
b++; }
}
s=0;
for(int l=0; l<n; l++)
if(r[l] != -1) s++;//重复减了很多次 ,应改为这样
}while(s>1);

while(r[k] == -1)
k++;
cout<<t[k]<<end