找“水王”

题目要求:
•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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之中存储的大部分是水王数字但不是全都是水王数字。
posted @ 2018-12-09 21:05  枕溪  阅读(114)  评论(0编辑  收藏  举报