找水王2

随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
条件为:
       在一个数组str中,存在着水王0水王1水王2、及其他用户。其中水王均超过了25%。
问题为:
       找到水王。
问题简化为:
      在str数组中,存在着0-9数字,其中三个数字的个数均超过了25%,找到这三个数字。
设计思想
      1、先构建一个有若干个数字的数组,其中三个水王数字超过25%。
      2、将相邻数字匹配,相同则留下,不同则删去。
      3、在处理后的数组中随机找数字,相同即为水王。
实验代码
  1 #include <iostream>
  2 #include <ctime>
  3 #include <string>
  4 using namespace std;
  5 string STR()
  6 {
  7     srand((unsigned)time(0));
  8     int Numstr = 1000;   //定义数组长度
  9     int f=1;
 10     while(f)
 11     { 
 12         int num0=0;    //记录水王0数字个数
 13         int num1=0;    //记录水王1数字个数
 14         int num2=0;    //记录水王2数字个数
 15         string str = "";
 16         int Shuiwang0=rand()%10;  //随机定义水王0数字   因为总体人数肯定比10大,现假设定义为10
 17         int Shuiwang1=rand()%10;  //随机定义水王1数字
 18         int Shuiwang2=rand()%10;  //随机定义水王2数字
 19         if(Shuiwang0==Shuiwang1||Shuiwang0==Shuiwang2||Shuiwang1==Shuiwang2)   //三个水王数字不得相同
 20         {
 21             continue;
 22         }
 23         while (Numstr!=0)
 24         {
 25             int F=rand()%40;
 26             if(F <= 11) //  加水王0数字
 27             {
 28                 str+=Shuiwang0+48;
 29                 num0++;
 30                 Numstr--;
 31                 continue;
 32             }
 33             else if(F <= 22) //  加水王1数字
 34             {
 35                 str+=Shuiwang1+48;
 36                 num1++;
 37                 Numstr--;
 38                 continue;
 39             }
 40             else if(F <= 33) //  加水王2数字
 41             {
 42                 str+=Shuiwang2+48;
 43                 num2++;
 44                  Numstr--;
 45                  continue;
 46             }
 47             else             //否则 加水王或者其他数字    
 48             {
 49                 str+=rand()%10+48;
 50                 Numstr--;
 51             }
 52         }
 53         int n=Numstr/4;     
 54         if(num0>n&&num1>n&&num2>n)   //三个小水王的个数 应该都大于1/4
 55         {
 56             cout<<"含水王的数组:"<<str<<endl;
 57             cout<<"水王数字的个数:"<<" "<<Shuiwang0<<" "<<num0<<" "<<Shuiwang1<<" "<<num1<<" "<<Shuiwang2<<"  "<<num2<<endl;
 58             return str;
 59         }
 60     }
 61 }
 62 string Add(string str)
 63 {
 64     //相邻数字 匹配  相同则复制到str1中  
 65     string str1 = "";
 66     for(int i=0;i<str.length()-1;i=i+2)
 67     {
 68         if(str[i]==str[i+1])
 69         {
 70             str1+=str[i];
 71         }
 72     }
 73     return str1;
 74 }
 75 int Search(string str)
 76 {
 77     //其中任取若干 相同则是水王
 78     //此时取3个
 79     int Shuiwang;
 80     while(1)
 81     {
 82         int a=rand()%str.length();
 83         int b=rand()%str.length();
 84         int c=rand()%str.length();
 85         if(str[a]==str[b]&&str[a]==str[c])
 86         {
 87             Shuiwang=str[a]-48;
 88             break;
 89         }
 90     }
 91     return Shuiwang;
 92 }
 93 void main()
 94 {
 95     //构造数组str
 96     string str=STR();
 97     string str1=Add(str);
 98     cout<<str1<<endl;     //此时str1中  绝大部分都是水王数字
 99     int Shuiwang[3];     //存放水王数字的数组
100     while(1)     
101     {
102         Shuiwang[0]=Search(str1);
103         Shuiwang[1]=Search(str1);
104         Shuiwang[2]=Search(str1);
105         if(Shuiwang[0]!=Shuiwang[1]&&Shuiwang[0]!=Shuiwang[2]&&Shuiwang[1]!=Shuiwang[2])  //寻找的三个水王不相同
106         {
107             break;
108         }
109     }
110     cout<<"三个小水王为:"<<Shuiwang[0]<<"  "<<Shuiwang[1]<<"  "<<Shuiwang[2]<<endl;
111 }

结果截图:

原文地址:https://www.cnblogs.com/L-Damon-v/p/5540099.html