软件工程课堂训练———找三个小水王
一、题目描述
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
二、解决思路
沿用上次消除的思想,定义三个计数器和三个嫌疑水王,比较三个ID,如果不相同,就排除,如果相同,那么计数器加一。嫌疑水王ID都与其它水军ID进行抵消最后剩下的就是三个水王。
三、程序代码
// shuiba.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" int main() { int length; int Idcou[3]={0,0,0};//计数器初始化为0 int ID[3]={0,0,0}; //水王id初始化为0 printf("请输入发帖的数量:"); scanf("%d",&length); int * shuiwang=new int [length]; printf("请输入所有发帖人的ID:"); for(int j=0;j<length;j++)//输入id { scanf("%d",&shuiwang[j]); } for(int i=0;i<length;i++)//找水王 { if(Idcou[0]==0 && shuiwang[i]!=ID[1] && shuiwang[i]!=ID[2]) { Idcou[0]=1; ID[0]=shuiwang[i]; } else if(Idcou[1]==0 &&shuiwang[i]!=ID[0] && shuiwang[i]!=ID[2]) { Idcou[1]=1; ID[1]=shuiwang[i]; } else if(Idcou[2]==0 &&shuiwang[i]!=ID[0] && shuiwang[i]!=ID[1]) { Idcou[2]=1; ID[2]=shuiwang[i]; } else if(shuiwang[i]!=ID[0] && shuiwang[i]!=ID[1] && shuiwang[i]!=ID[2]) { Idcou[0]--; Idcou[1]--; Idcou[2]--; } else if(shuiwang[i]==ID[0]) { Idcou[0]++; } else if(shuiwang[i]==ID[1]) { Idcou[1]++; } else if(shuiwang[i]==ID[2]) { Idcou[2]++; } } printf("三个水王的ID是:\n"); printf("%d\t%d\t%d\t\n",ID[0],ID[1],ID[2]); return 0; }
四、运行结果
五、心得体会
三个水王和一个水王的问题有很多相似之处,但这个问题刚开始运行结果出来是错误的,后来找到了问题的原因,有一部分可能性忽略了。做完两个找水王的练习之后,我觉得最牛的不是找到最优方法解决问题的人,而是那个幕后的出题者。