找“水王”
题目要求:
•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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之中存储的大部分是水王数字但不是全都是水王数字。