1. 程式人生 > >找“水王”

找“水王”

題目要求: •三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,他不但喜歡發帖,還會回覆其他ID發的每個帖子。坊間風聞該“水王”發帖數目超過了帖子數目的一半。 •如果你有一張當前論壇的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?   設計思想: 簡化為:在一個數組中,儲存了0-9數字,其中某數字出現的次數超過了總儲存的50%,則要找到這個數字。 所以要先構建一個儲存著若干個數字的陣列,其中“水王”數字出現次數超過總量的50%;根據老師上課時給出的提示,將相鄰數字匹配,相同則留下,不同則刪去;這樣遍歷一遍即可找到“水王”數字。   程式碼實現:

 

 1 #include <iostream>
 2 #include <ctime>
 3 #include <string>
 4 using namespace std;
 5 
 6 void main()
 7 {
 8     srand((unsigned)time(0));   //重點記憶該用法
 9     string str = "";
10     int Num = 1000;         //定義最大陣列長度為1000
11     int n=0;               //定義n,記錄水王數字出現的次數
12
int Water=rand()%10; //隨機定義水王數字 13 int i; 14 while (Num!=0) 15 { 16 if(rand()%10 <= 5) 17 { 18 str+=Water+48; 19 n++; 20 } 21 else 22 { 23 str+=rand()%10+48; 24 } 25 Num--; 26 } 27 cout<<"
含水王的陣列為:"<<endl<<str<<endl; 28 cout<<"水王數字出現的次數為:"<<endl<<n<<endl; 29 string str1 = ""; //相鄰數字進行匹配,若相同則複製到str1中 30 for(i=0;i<str.length();i=i+2) //用str.length()求得陣列長度 31 { 32 if(str[i]==str[i+1]) 33 { 34 str1+=str[i]; 35 } 36 } 37 cout<<"儲存水王的新陣列為:"<<endl<<str1<<endl; //此時str1中,絕大部分都是水王數字 38 39 while(1)//在str1中判斷水王數字 40 { 41 int a=rand()%str1.length(); 42 int b=rand()%str1.length(); 43 int c=rand()%str1.length(); 44 if(str1[a]==str1[b]&&str1[a]==str1[c]) 45 { 46 cout<<"水王是:"<<str1[a]<<endl; 47 break; //如果沒有這一行,就會輸出很多個“水王是:x”的字樣 48 } 49 } 50 system("pause"); 51 }

 

  實現截圖:

 

個人總結: 1.學到了srand((unsigned)time(0))的意義與用法:用0呼叫時間函式time(),將其返回值強制轉換為unsigned型,作為引數來呼叫srand( )函式。srand( )是為rand( )函式初始化隨機發生器的啟動狀態,以產生偽隨機數,所以常把srand( )稱為種子函式。用time()返回的時間值做種子的原因是time()返回的是實時時間值,每時毎刻都在變化,這樣產生的偽隨機數就有以假亂真的效果。 2.注意str1之中儲存的大部分是水王數字但不是全都是水王數字。