跪求一段完整C++代码
投币,每次投掷硬币有50%的概率为正面,50%的概率为反面。若为正面,则x=1,若为负面,则x=-1。将每次投币得到的x相加,y是这些x的和。y的初始值是0,y第一次到达...
投币,每次投掷硬币有50%的概率为正面,50%的概率为反面。 若为正面,则x=1, 若为负面,则x=-1。 将每次投币得到的x相加,y是这些x的和。y的初始值是0,y第一次到达5或者第一次到达-10时,投币结束。 这样即为一局游戏结束。 每一局新游戏开始时,y值变回0.
要求: 1. 可以输入 n = 希望进行的游戏局数
2. print a = 平均每局游戏投币的次数
3. print m = 出现局数最多的投币次数 。 (e.g, 如果n=5, 5局游戏的投币次数分别是 15,40,28,37,28, 则m=28) 展开
要求: 1. 可以输入 n = 希望进行的游戏局数
2. print a = 平均每局游戏投币的次数
3. print m = 出现局数最多的投币次数 。 (e.g, 如果n=5, 5局游戏的投币次数分别是 15,40,28,37,28, 则m=28) 展开
3个回答
展开全部
#include <iostream>
#include <list>
#include <map>
#include <cstdlib>
using namespace std;
typedef list<int> OneCoinGameRound;
typedef list<OneCoinGameRound> CoinGameRecorder;
class CoinGame
{
public:
// 表示出现正面
static const int COIN_FRONT_SIDE = 0;
// 表示出现背面
static const int COIN_BACK_SIDE = 1;
// 出现正面的得分
static const int COIN_FRONT_SIDE_SCORE = 1;
// 出现背面的得分
static const int COIN_BACK_SIDE_SCORE = -1;
// 游戏结束条件:得分上限
static const int MAX_SCORE_LIMIT = 5;
// 游戏结束条件:得分下限
static const int MIN_SCORE_LIMIT = -10;
// 不存在局数最多的投币次数
static const int NONE_MAX = -1;
public:
/*
构造函数
参数:
n 游戏要进行的局数
*/
CoinGame(int n):n(n)
{
// 重置随机数种子
srand(time(NULL));
// 进行 n 局投币游戏
for(int i=0;i<n;i++)
{
this->allConiGameRounds.push_back(startOneRound());
}
}
// 输出游戏过程以及统计数据
void print()
{
int p=1;
// 每局游戏信息
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
cout << "第\t" << p++ << "局:" << endl;
for(OneCoinGameRound::iterator j=(*i).begin();j!=(*i).end();j++)
{
cout << "\t" << ( (*j) == COIN_FRONT_SIDE ? "正面" : "反面") << endl;
}
cout << "一共投掷了:"
<< getTotalThrowTimeInOneRound(*i) << "次,其中正面:"
<< getFrontSideAppearTimesInOneRound(*i) << "次,反面:"
<< getBackSideAppearTimesInOneRound(*i) << "次,得分:"
<< getScoreInOneRound(*i)<< endl << endl;
}
//平均每局游戏投币的次数
cout << "平均每局游戏投币的次数:" << getAverage() << endl;
// 出现局数最多的投币次数
int max = getMax();
if(max == NONE_MAX)
{
cout << "每种投币次数出现的局数相同!,投币次数分别为:" ;
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
cout << getTotalThrowTimeInOneRound(*i)<< " ";
}
cout << endl;
}
else
{
cout << "出现局数最多的投币次数:" << max << endl;
}
}
private:
//平均每局游戏投币的次数
int getAverage()
{
if(this->allConiGameRounds.size()==0)
{
return 0;
}
int average=0;
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
average += (*i).size();
}
return average / this->allConiGameRounds.size();
}
/*
出现局数最多的投币次数
不存在出现局数最多的投币次数的情况:
1)没有开始游戏
2)每局的投币次数都不同
*/
int getMax()
{
if(this->allConiGameRounds.size()==0)
{
return NONE_MAX;
}
map<int,int> max;
// 统计每局游戏的投币次数
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
int throwTime = getTotalThrowTimeInOneRound(*i);
if(max.find(throwTime) == max.end())
{
max[throwTime] = 1;
}
else
{
max[throwTime]++;
}
}
// 找出出现局数最多的投币次数
map<int,int>::iterator i=max.begin();
map<int,int>::iterator r = i;
for(++i;i!=max.end();i++)
{
if(r->second < i->second)
{
r=i;
}
}
return (r->second == 1 && this->allConiGameRounds.size()>1 ) ? NONE_MAX : r->first;
}
private:
/*
进行一次投币
返回:
0 表示正面
1 表示背面
*/
int throwCoin()
{
return rand()%2;
}
/*
进行一局游戏。
一局游戏的定义:
若为投币为正面,则 x=COIN_FRONT_SIDE_SCORE,
若为投币为负面,则 x=COIN_BACK_SIDE_SCORE。
将每次投币得到的x相加,y是这些x的和。
y第一次到达 MAX_SCORE_LIMIT 或者第一次到达 MIN_SCORE_LIMIT 时,投币结束。
这样即为一局游戏结束。
返回:
是一个 vector , 按投掷顺序保存本局游戏的投币情况。
*/
OneCoinGameRound startOneRound()
{
int score=0;
OneCoinGameRound oneCoinGameRound;
// 进行若干次投币,直到符合一局的条件退出
while(score > MIN_SCORE_LIMIT && score < MAX_SCORE_LIMIT)
{
// 随机投币
int coin = throwCoin();
// 记录投币情况
oneCoinGameRound.push_back(coin);
// 计算投币得分
score += coin == COIN_FRONT_SIDE ? COIN_FRONT_SIDE_SCORE : COIN_BACK_SIDE_SCORE;
}
return oneCoinGameRound;
}
int getScoreInOneRound(OneCoinGameRound & oneCoinGameRound)
{
int score = 0;
for(OneCoinGameRound::iterator i=oneCoinGameRound.begin();i!=oneCoinGameRound.end();i++)
{
score += (*i) == COIN_FRONT_SIDE ? COIN_FRONT_SIDE_SCORE : COIN_BACK_SIDE_SCORE;
}
return score;
}
int getTotalThrowTimeInOneRound(OneCoinGameRound & oneCoinGameRound)
{
return oneCoinGameRound.size();
}
int getFrontSideAppearTimesInOneRound(OneCoinGameRound & oneCoinGameRound)
{
int t = 0;
for(OneCoinGameRound::iterator i=oneCoinGameRound.begin();i!=oneCoinGameRound.end();i++)
{
t += (*i) == COIN_FRONT_SIDE ? 1 : 0;
}
return t;
}
int getBackSideAppearTimesInOneRound(OneCoinGameRound & oneCoinGameRound)
{
return
getTotalThrowTimeInOneRound(oneCoinGameRound)
-
getFrontSideAppearTimesInOneRound(oneCoinGameRound);
}
private:
// 游戏要进行的局数
int n;
// 每局游戏投币的具体情况
CoinGameRecorder allConiGameRounds;
};
int main(int argc, char *argv[])
{
int n;
cout << "输入游戏局数:";
while(cin >> n)
{
CoinGame coinGame(n);
coinGame.print();
cout << "输入游戏局数:";
}
return 0;
}
/*
输入游戏局数:3
第 1局:
正面
反面
反面
反面
正面
正面
正面
反面
反面
正面
正面
反面
正面
反面
反面
正面
正面
反面
反面
反面
正面
正面
正面
反面
正面
正面
反面
反面
反面
反面
正面
反面
反面
正面
反面
正面
反面
反面
正面
正面
正面
反面
反面
反面
反面
反面
正面
正面
正面
正面
反面
正面
正面
反面
反面
反面
反面
正面
正面
反面
反面
反面
反面
反面
反面
反面
一共投掷了:66次,其中正面:28次,反面:38次,得分:-10
第 2局:
正面
反面
反面
反面
正面
正面
正面
正面
反面
正面
反面
反面
正面
正面
反面
正面
正面
反面
反面
正面
正面
反面
反面
正面
正面
反面
正面
正面
正面
一共投掷了:29次,其中正面:17次,反面:12次,得分:5
第 3局:
反面
反面
反面
正面
正面
正面
反面
正面
反面
正面
正面
正面
反面
反面
反面
反面
反面
反面
反面
正面
反面
反面
正面
反面
正面
反面
反面
正面
正面
反面
正面
反面
正面
正面
正面
正面
正面
正面
反面
反面
正面
反面
反面
正面
反面
反面
反面
反面
正面
反面
反面
正面
反面
反面
反面
正面
正面
反面
反面
反面
一共投掷了:60次,其中正面:25次,反面:35次,得分:-10
平均每局游戏投币的次数:51
每种投币次数出现的局数相同!,投币次数分别为:66 29 60
输入游戏局数:
*/
#include <list>
#include <map>
#include <cstdlib>
using namespace std;
typedef list<int> OneCoinGameRound;
typedef list<OneCoinGameRound> CoinGameRecorder;
class CoinGame
{
public:
// 表示出现正面
static const int COIN_FRONT_SIDE = 0;
// 表示出现背面
static const int COIN_BACK_SIDE = 1;
// 出现正面的得分
static const int COIN_FRONT_SIDE_SCORE = 1;
// 出现背面的得分
static const int COIN_BACK_SIDE_SCORE = -1;
// 游戏结束条件:得分上限
static const int MAX_SCORE_LIMIT = 5;
// 游戏结束条件:得分下限
static const int MIN_SCORE_LIMIT = -10;
// 不存在局数最多的投币次数
static const int NONE_MAX = -1;
public:
/*
构造函数
参数:
n 游戏要进行的局数
*/
CoinGame(int n):n(n)
{
// 重置随机数种子
srand(time(NULL));
// 进行 n 局投币游戏
for(int i=0;i<n;i++)
{
this->allConiGameRounds.push_back(startOneRound());
}
}
// 输出游戏过程以及统计数据
void print()
{
int p=1;
// 每局游戏信息
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
cout << "第\t" << p++ << "局:" << endl;
for(OneCoinGameRound::iterator j=(*i).begin();j!=(*i).end();j++)
{
cout << "\t" << ( (*j) == COIN_FRONT_SIDE ? "正面" : "反面") << endl;
}
cout << "一共投掷了:"
<< getTotalThrowTimeInOneRound(*i) << "次,其中正面:"
<< getFrontSideAppearTimesInOneRound(*i) << "次,反面:"
<< getBackSideAppearTimesInOneRound(*i) << "次,得分:"
<< getScoreInOneRound(*i)<< endl << endl;
}
//平均每局游戏投币的次数
cout << "平均每局游戏投币的次数:" << getAverage() << endl;
// 出现局数最多的投币次数
int max = getMax();
if(max == NONE_MAX)
{
cout << "每种投币次数出现的局数相同!,投币次数分别为:" ;
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
cout << getTotalThrowTimeInOneRound(*i)<< " ";
}
cout << endl;
}
else
{
cout << "出现局数最多的投币次数:" << max << endl;
}
}
private:
//平均每局游戏投币的次数
int getAverage()
{
if(this->allConiGameRounds.size()==0)
{
return 0;
}
int average=0;
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
average += (*i).size();
}
return average / this->allConiGameRounds.size();
}
/*
出现局数最多的投币次数
不存在出现局数最多的投币次数的情况:
1)没有开始游戏
2)每局的投币次数都不同
*/
int getMax()
{
if(this->allConiGameRounds.size()==0)
{
return NONE_MAX;
}
map<int,int> max;
// 统计每局游戏的投币次数
for(CoinGameRecorder::iterator i=this->allConiGameRounds.begin();i!=this->allConiGameRounds.end();i++)
{
int throwTime = getTotalThrowTimeInOneRound(*i);
if(max.find(throwTime) == max.end())
{
max[throwTime] = 1;
}
else
{
max[throwTime]++;
}
}
// 找出出现局数最多的投币次数
map<int,int>::iterator i=max.begin();
map<int,int>::iterator r = i;
for(++i;i!=max.end();i++)
{
if(r->second < i->second)
{
r=i;
}
}
return (r->second == 1 && this->allConiGameRounds.size()>1 ) ? NONE_MAX : r->first;
}
private:
/*
进行一次投币
返回:
0 表示正面
1 表示背面
*/
int throwCoin()
{
return rand()%2;
}
/*
进行一局游戏。
一局游戏的定义:
若为投币为正面,则 x=COIN_FRONT_SIDE_SCORE,
若为投币为负面,则 x=COIN_BACK_SIDE_SCORE。
将每次投币得到的x相加,y是这些x的和。
y第一次到达 MAX_SCORE_LIMIT 或者第一次到达 MIN_SCORE_LIMIT 时,投币结束。
这样即为一局游戏结束。
返回:
是一个 vector , 按投掷顺序保存本局游戏的投币情况。
*/
OneCoinGameRound startOneRound()
{
int score=0;
OneCoinGameRound oneCoinGameRound;
// 进行若干次投币,直到符合一局的条件退出
while(score > MIN_SCORE_LIMIT && score < MAX_SCORE_LIMIT)
{
// 随机投币
int coin = throwCoin();
// 记录投币情况
oneCoinGameRound.push_back(coin);
// 计算投币得分
score += coin == COIN_FRONT_SIDE ? COIN_FRONT_SIDE_SCORE : COIN_BACK_SIDE_SCORE;
}
return oneCoinGameRound;
}
int getScoreInOneRound(OneCoinGameRound & oneCoinGameRound)
{
int score = 0;
for(OneCoinGameRound::iterator i=oneCoinGameRound.begin();i!=oneCoinGameRound.end();i++)
{
score += (*i) == COIN_FRONT_SIDE ? COIN_FRONT_SIDE_SCORE : COIN_BACK_SIDE_SCORE;
}
return score;
}
int getTotalThrowTimeInOneRound(OneCoinGameRound & oneCoinGameRound)
{
return oneCoinGameRound.size();
}
int getFrontSideAppearTimesInOneRound(OneCoinGameRound & oneCoinGameRound)
{
int t = 0;
for(OneCoinGameRound::iterator i=oneCoinGameRound.begin();i!=oneCoinGameRound.end();i++)
{
t += (*i) == COIN_FRONT_SIDE ? 1 : 0;
}
return t;
}
int getBackSideAppearTimesInOneRound(OneCoinGameRound & oneCoinGameRound)
{
return
getTotalThrowTimeInOneRound(oneCoinGameRound)
-
getFrontSideAppearTimesInOneRound(oneCoinGameRound);
}
private:
// 游戏要进行的局数
int n;
// 每局游戏投币的具体情况
CoinGameRecorder allConiGameRounds;
};
int main(int argc, char *argv[])
{
int n;
cout << "输入游戏局数:";
while(cin >> n)
{
CoinGame coinGame(n);
coinGame.print();
cout << "输入游戏局数:";
}
return 0;
}
/*
输入游戏局数:3
第 1局:
正面
反面
反面
反面
正面
正面
正面
反面
反面
正面
正面
反面
正面
反面
反面
正面
正面
反面
反面
反面
正面
正面
正面
反面
正面
正面
反面
反面
反面
反面
正面
反面
反面
正面
反面
正面
反面
反面
正面
正面
正面
反面
反面
反面
反面
反面
正面
正面
正面
正面
反面
正面
正面
反面
反面
反面
反面
正面
正面
反面
反面
反面
反面
反面
反面
反面
一共投掷了:66次,其中正面:28次,反面:38次,得分:-10
第 2局:
正面
反面
反面
反面
正面
正面
正面
正面
反面
正面
反面
反面
正面
正面
反面
正面
正面
反面
反面
正面
正面
反面
反面
正面
正面
反面
正面
正面
正面
一共投掷了:29次,其中正面:17次,反面:12次,得分:5
第 3局:
反面
反面
反面
正面
正面
正面
反面
正面
反面
正面
正面
正面
反面
反面
反面
反面
反面
反面
反面
正面
反面
反面
正面
反面
正面
反面
反面
正面
正面
反面
正面
反面
正面
正面
正面
正面
正面
正面
反面
反面
正面
反面
反面
正面
反面
反面
反面
反面
正面
反面
反面
正面
反面
反面
反面
正面
正面
反面
反面
反面
一共投掷了:60次,其中正面:25次,反面:35次,得分:-10
平均每局游戏投币的次数:51
每种投币次数出现的局数相同!,投币次数分别为:66 29 60
输入游戏局数:
*/
追问
谢谢你~经测试,非常正确。 不过可以不要把每次投掷硬币的结果都显示出来吗? 可以显示一下每局投掷硬币的次数。 另外,可以再多打一个变量吗?显示m出现了多少次。例如进行6局,而这6局投币次数分别为37,30,28,30,30,37,45 那么你的程序里m=30 (出现局数最多的投币次数为30,出现了3次),可以另外让他把这个3也打出来吗?
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
展开全部
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void main()
{
int n,*a;
float aver;
int i,j;
int max,maxtimes;
cout<<"n=";
cin>>n;
srand( (unsigned)time( NULL ) );
a=new int[n];
aver=0;
for(i=0;i<n;i++)
{
int y=0;
int cnt=0;
while(y<5 && y>-10)
{
if(rand()%2==1)
y++;
else
y--;
cnt++;
}
a[i]=cnt;
aver+=cnt;
}
for(i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
aver/=n;
cout<<"a="<<aver<<endl;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
maxtimes=0;
i=0;
while(i<n)
{
for(j=i;a[j+1]==a[j];j++);
if(j-i+1>maxtimes)
{
maxtimes=j-i+1;
max=a[j];
}
i=j+1;
}
cout<<"m="<<max<<endl;
}
由于算法的问题,我的程序在局数没有重复数字的情况下,输出的是最小值。
#include <cstdlib>
#include <ctime>
using namespace std;
void main()
{
int n,*a;
float aver;
int i,j;
int max,maxtimes;
cout<<"n=";
cin>>n;
srand( (unsigned)time( NULL ) );
a=new int[n];
aver=0;
for(i=0;i<n;i++)
{
int y=0;
int cnt=0;
while(y<5 && y>-10)
{
if(rand()%2==1)
y++;
else
y--;
cnt++;
}
a[i]=cnt;
aver+=cnt;
}
for(i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
aver/=n;
cout<<"a="<<aver<<endl;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
maxtimes=0;
i=0;
while(i<n)
{
for(j=i;a[j+1]==a[j];j++);
if(j-i+1>maxtimes)
{
maxtimes=j-i+1;
max=a[j];
}
i=j+1;
}
cout<<"m="<<max<<endl;
}
由于算法的问题,我的程序在局数没有重复数字的情况下,输出的是最小值。
更多追问追答
追问
谢谢你, n和a都对,不过m不是我本来想要的,你可以再加一个print 出现局数最多的投币次数吗? 例如进行6局,而这6局投币次数分别为37,30,28,30,30,37,45 那么你的程序里m=3 (出现局数最多的投币次数为30,出现了3次),可以另外让他把这个30也打出来吗?
追答
我的程序如果碰到37,30,28,30,30,37,45 这种情况,是会输出30的,不是输出3。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t t;
srand((unsigned) time(&t));//保证每次运行都是随机数 去掉 这句随机数消失
int n=0,i=0,y=0,x=0,maxk=0,sumk=0;
float avgk=0;
printf("请输入进行的局数:");scanf("%d",&n);getchar();
if(n<1){
printf("局数错误:");getchar();
return 0;
}
for(i=0;i<n;i++){
int k=0;
while(!(y>=5||y<=-10)){
x=rand()%2==1?1:-1;//2为正面 1为负面
y+=x;
k++;
}
sumk+=k;
maxk=maxk>k?maxk:k;
}
avgk=maxk*1.0/n;
printf("平均每局游戏投币的次数:%.2f\n",avgk);//自己处理为整数 现在是小数 两位
printf("出现局数最多的投币次数:%d\n",maxk);
getchar();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t t;
srand((unsigned) time(&t));//保证每次运行都是随机数 去掉 这句随机数消失
int n=0,i=0,y=0,x=0,maxk=0,sumk=0;
float avgk=0;
printf("请输入进行的局数:");scanf("%d",&n);getchar();
if(n<1){
printf("局数错误:");getchar();
return 0;
}
for(i=0;i<n;i++){
int k=0;
while(!(y>=5||y<=-10)){
x=rand()%2==1?1:-1;//2为正面 1为负面
y+=x;
k++;
}
sumk+=k;
maxk=maxk>k?maxk:k;
}
avgk=maxk*1.0/n;
printf("平均每局游戏投币的次数:%.2f\n",avgk);//自己处理为整数 现在是小数 两位
printf("出现局数最多的投币次数:%d\n",maxk);
getchar();
return 0;
}
追问
谢谢你, 经测试, maxk和n都对,不过avgk不是平均每局投币次数,而是maxk/n。
可以改一下a吗? 另外,可以再帮我加一个 print 出现局数最多的投币次数 出现了多少局,即maxk出现了多少次?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询