第三题比酒量:
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
答案写在“解答.txt”中,不要写在这里!
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d;
for (a=20;a>=4;a--)
{
for (b=a-1;b>=3;b--)
{
for (c=b-1;c>=2;c--)
{
for (d=c-1;d>=1;d--)
{
if ( 1.0/a+1.0/b+1.0/c+1.0/d == 1)
printf("%d,%d,%d,%d,0\n",a,b,c,d);
}
}
}
}
}
第四题奇怪的比赛:
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
答案写在“解答.txt”中,不要写在这里!
/*法1:纯暴力解决
include<math.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f,g,h,i,j;
for(a=0; a<2; a++)
for(b=0; b<2; b++)
for(c=0; c<2; c++)
for(d=0; d<2; d++)
for(e=0; e<2; e++)
for(f=0; f<2; f++)
for(g=0; g<2; g++)
for(h=0; h<2; h++)
for(i=0; i<2; i++)
for(j=0; j<2; j++)
{
score=10;
a==0?score-1:score*2;
b==0?score-2:score*2;
c==0?score-3:score*2;
d==0?score-4:score*2;
e==0?score-5:score*2;
f==0?score-6:score*2;
g==0?score-7:score*2;
h==0?score-8:score*2;
i==0?score-9:score*2;
j==0?score-10:score*2;
}
if(score==100)
cout<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<endl;
return 0;
}
*/
/*法二:递归
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int s[10];
void fun(int i,int score)
{
if(i==10)
{
if(score==100)
{
for(int j=0; j<10; j++)
printf("%d",s[j]);
printf("\n");
}
}
else
{
s[i]=0;//第n题错误的情况下
fun(i+1,score-i-1);
s[i]=1;//第n题正确的情况下
fun(i+1,2*score);
}
}
int main()
{
memset(s,0,sizeof(s));
fun(0,10);
}
*/
/*法三:字符串
#include <iostream>
#include<cstdio>
using namespace std;
void f(char s[],int n,int sum)
{
if(n==10)
{
if(sum==100)
puts(s);
}
else
{
s[n]='0';
f(s,n+1,sum-n-1);
s[n]='1';
f(s,n+1,sum*2);
}
}
int main()
{
char a[10];
a[10]='\0';
f(a,0,10);
return 0;
}
*/
/*法四:进制转换
///十进制转化成二进制
#include<math.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int i,j,k,score;
int s[10];
for(i=0; i<=pow(2,10); ++i)
{
score=10;
k=i;
for(j=0; j<=9; j++)
{
s[j]=k%2;
k=k/2;
}
for(j=9; j>=0; --j)
if(s[j])
score*=2;
else score-=10-j;
if(score==100)
{
for(j=9; j>=0; --j)
printf("%d",s[j]);
printf("\n");
}
}
}
截图:
总结:不是0就是1可以用int 型,可以用char 型
a[10]='\0';意思是字符串结束符
还有进制转换