[タイトル]説明:
一部に考えると、黒豆、およびいくつかの白いコーヒーポットと「余分な」黒豆の多くの豆。:豆まで唯一のタンクまでの処理を繰り返す
;(1)無作為に2つのジャー豆のそれぞれから選択される
、(2)同じ色ならば、それらは破棄され、余分な黒豆に入れ;
(3)異なる色が、それは白い豆、黒豆、廃棄にバックジャーになる場合。
色白豆と黒豆の数、最初はどのような数学的関係で最後に残った豆を得られた結果から推測され、プロセスが終了することを証明するためのプロセスをシミュレートするプログラムを設計してください?
[分析]:
タイトル、二つの要求は抽象あり、最初のプログラムは、対象に記載されたプロセスをシミュレートするように設計され、そして第二には、コーヒー豆の分析手順の結果の数との関係です。
タイトルがどのようにコーヒー豆とコーヒー缶の割合はコーヒー色指定していないので、これは、プログラムの実行中に入力するための変数です。
ルールタイトルがある:
1)黒に、コーヒー豆の同色場合コーヒー豆を動作するように、
2)白色にヘテロコーヒー豆、コーヒー豆場合に動作するように、
それによって別個の条件を関連付けます数学的な排他的論理和演算(XOR):
同じ2つの数字、排他的論理和の結果が0であり、
異なる二つの数字、結果は排他的論理和です。
バック白色に豆が異なる場合コーヒー豆は、それが0を使用することができるので表す白色豆、黒豆を表します。コーヒー豆を満たすために、操作を破棄し、選択するには、リンクされたリストには、加算を実行するために、データ構造の操作は、コーヒー豆を格納します。
最後に、コーヒー豆コーヒー豆の初期量との関係:
粒子がBを有するコーヒー豆粒子と白い豆wは、Nコーヒー缶コーヒー豆、黒豆の合計を設定します。各々が豆コーヒー豆の数を取った後、すなわち、タンクマイナス1であるNから1を引きました。豆のうち2つずつが、瓶内の唯一の最後の1の総量を削減する、処理を終了します。
3例次取られたコーヒー豆の各色:
豆は2つの黒い(BB)です@、2は、捨てられ、その後、戻って追加の黒豆にされている
ので、この時点では、黒豆のように表されます。 + = 2. 1-B-B 1;
2つのBeanは、(WW)が白色である@、二つは、追加の黒豆に戻し、その後捨てされ、
この時点で白い豆のように表すように、W-2 ;
@ビーンズ2つの異なる色(BW)、ブラック鋳造ブランク、即ち、1マイナス黒豆、ホワイト豆番号不変。
これは、2と2で、白豆変化無しまたは減少のいずれかの数を見ることができます。
それは開始コーヒージャー白い豆の数が偶数である場合、残りの一つは必ずしも黒豆である、ということになる。数が奇数の場合白コーヒー豆、残りのコーヒー豆でなければなりません白いです。
この問題は、最終的な結果は、唯一のコーヒー豆の初期量のパリティにかかわらず、ランダム抽出の、固定されており、「ランダム抽出」という言葉の使用がトラップを提供していることを示しています。
環境をコンパイルします
、適切にエラーがプログラムをコンパイルしないようにDEV C ++を使用しますが、プログラムは次のエラーを報告します。コンパイルするには、Visual C ++を使用するときにする場合:
これはちょうど私の変数の問題を定義して、私は++ DEVCで次のコードを定義したが使用を許可されています私は内側に定義されている場合、私はここで同じ変数である。
しかし、ビジュアルC ++で定義された同じ変数では繰り返さない、それは変数の定義における()ループための第二べきである私が削除されます。
実際には、最高溶液は私は()外ループ、統一された定義ではなく、複数の定義== "のために配置される変数を定義することであるべきである
:結果
コード:
#include <iostream>
#include <vector>
#include <time.h>
#include <stdlib.h>
using namespace std;
//定义咖啡罐类
class CoffeeJar{
public:
CoffeeJar(int blackNum, int whiteNum){ //构造函数,初始化变量
blackNumber = blackNum;
whiteNumber = whiteNum;
total = blackNumber+whiteNumber;
int i;
for (i = 0;i<blackNumber;i++){
jar.push_back(0);
}
for (i = 0;i<whiteNumber;i++){
jar.push_back(1);
}
}
~CoffeeJar(){
jar.clear();
delete &jar; //析构函数,回收vector的空间
}
void getCoffeeBean(); //随机抽取豆子的方法
bool isWhiteBean(int color){ //判断豆子的颜色是否为白咖啡豆
return color == 1;
}
int getTotal(){ //获取咖啡豆的总数
return total;
}
void printBeanColor(); //打印咖啡豆颜色
private:
vector<int> jar; //存储咖啡豆,0表示黑色,1表示白色
int blackNumber; //黑色咖啡豆数目
int whiteNumber; //白色咖啡豆数目
int total; //咖啡豆的总数目
};
//随机抽取咖啡豆
void CoffeeJar::getCoffeeBean(){
int fBean = 0; //初始化取的第一个豆子的颜色
int sBean = 0; //初始化取的第二个豆子的颜色
srand(static_cast<unsigned>(time(0))); //设置随机数种子
int maxRand = total; //设置随机数范围,即最大值
int fIndex = rand()%maxRand; //随机抽取的第一粒豆子的下标
int sIndex = rand()%maxRand; //第二粒豆子的下标
if (fIndex != sIndex){ //两次抽取的豆子不能使同一个
fBean = jar[fIndex]; //设置第一粒咖啡豆的颜色
sBean = jar[sIndex]; //设置第二粒咖啡豆的颜色
if(fBean == sBean){ //如果两粒咖啡豆的颜色相同
vector<int>::iterator iter = jar.begin()+fIndex;
jar.erase(iter); //删除一粒咖啡豆
if (jar.size() != 1) { //如果第二粒咖啡豆的存储位置在第一粒之后,索引减少一个
if(sIndex!=0 && sIndex > fIndex) {
sIndex--;
}
iter = jar.begin()+sIndex; //移除咖啡豆
jar.erase(iter);
jar.push_back(0); //添加一个黑色豆子
} else {
jar[0] = 0; //如果罐子中只剩一粒咖啡豆则直接添加黑色豆子
}
}else{ //如果两次取的豆子颜色不同则删除黑色豆子
if (!isWhiteBean(jar[fIndex])){ //判断豆子颜色
vector<int>::iterator iter = jar.begin()+fIndex;
jar.erase(iter);
}else if (!isWhiteBean(jar[sIndex])){
vector<int>::iterator iter = jar.begin()+sIndex;
jar.erase(iter);
}
}
total = jar.size(); //更新咖啡罐中的咖啡豆总数
}
}
//打印咖啡罐中的咖啡豆颜色
void CoffeeJar::printBeanColor(){
for (vector<int>::iterator i=jar.begin();i!=jar.end();++i){
cout<<(*i)<<endl;
}
}
//主函数
int main(){
int blackBeans,whiteBeans; //黑色咖啡豆和白色咖啡豆的数目
cout<<"请输入黑色咖啡豆和白色咖啡豆的数目:"<<endl;
cin>>blackBeans>>whiteBeans;
CoffeeJar *j = new CoffeeJar(blackBeans,whiteBeans); //初始化咖啡罐
while (j->getTotal()>1){
j->getCoffeeBean();
}
cout<<"最后剩余的咖啡豆颜色为:"<<endl;
j->printBeanColor(); //打印最终剩余的咖啡豆的颜色
return 0;
}