// 比對樂透的程式 2007/5/21 18:0-18:59:15
//g++ -pipe -o p6 p6.cpp && p6
#include <iostream>
#include <cstdlib>
using namespace std;
const int debug=1;
const int GROUP_COUNT=6; // 一次幾組號碼
const int MAX_NUMBER=45; // 最大號碼:1~MAX_NUMBER
// 輸入號碼組 & 檢測錯誤函數
int* input_number(){
int* nA=new int[GROUP_COUNT]; // 輸入號碼 array
int* p=nA; // just a ptr
int* r=new int[MAX_NUMBER]; // 為檢查輸入的號碼是否重複用
const char* err=NULL; // 錯誤發生
for(int i=0;i<GROUP_COUNT;i++,p++){
cin>>*p;
if(*p<1||*p>MAX_NUMBER)err="輸入錯誤號碼!"; // 檢查輸入範圍是否在 1~MAX_NUMBER
if(r[*p]++>1)err="輸入重複樂透號碼!"; // 註記輸入的號碼並檢查
if(err){
cout<<err<<endl;delete r,nA;
return NULL; // 傳回 NULL 表示錯誤
}
}
delete r;
int i;
while(i=cin.get(),i!='\n'){
if(i!=' '&&i!='\r'&&i!='\t'){
cout<<"輸入超過 "<< GROUP_COUNT <<" 組號碼或錯誤資料! (error: "<<i<<")"<<endl;
//return NULL;
}
}
return nA;
}
// inverse sort
int compare_func(const void* a, const void* b){
return *((int*)b)-*((int*)a);
}
int main(){
cout << "輸入此回合得獎的 "<< GROUP_COUNT <<" 組號碼:" << endl;
int goal[MAX_NUMBER]={0};
{
int* g=input_number(); // 呼叫輸入號碼組 & 檢測錯誤函數
if(!g)return 2; // 錯誤發生
int* p=g;
for(int i=0;i<GROUP_COUNT;i++){
goal[*p++]++; // 將中獎的號碼註記於goal,加快檢查速度。例如 goal[2]==1 表示有 2
}
delete g;
}
int count;
cout << "輸入總共買了幾組號碼:" << endl;
cin >> count;
if(count<1){cout << "錯誤號碼:"<<count<<"!" << endl;return 6;}
int* OK=new int[count];
for(int i=0;i<count;i++){
cout << "輸入你買的 "<< GROUP_COUNT <<" 組樂透號碼:" << endl;
int* n=input_number(); // 呼叫輸入號碼組 & 檢測錯誤函數
if(!n)return 8; // 錯誤發生
for(int j=0;j<GROUP_COUNT;j++){
OK[i]+=goal[n[j]];
}
delete n;
}
// 以quick排序法由大到小排序
qsort(OK,count,sizeof(*OK),compare_func);
// 輸出結果
cout << "結果為:" << endl;
for(int i=0;i<count;i++){
cout << OK[i] << " ";
}
cout << endl;
delete OK;
return 0;
}
2007年5月21日
lottery.cpp
有人要的
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言