软件工程课堂作业(十五)——揪出“水王”续
一、题目:
随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了总和的1/4。请设计算法从列表中快速找到他们。
二、设计思路:
扩展题目和原题基本相似,方法是一样的,都可用消除思想。可以三个比较,若不相同,则删除,若相同,则计数器加一。
三、源代码:
1 //找小“水王”——胡亚宝——2015/04/26 2 3 #include "stdafx.h" 4 #include"iostream" 5 6 7 8 int _tmain(int argc, _TCHAR* argv[]) 9 { 10 int len; 11 int idsum[3]={0,0,0}; 12 //int A[100]; 13 int ID[3]={0,0,0}; 14 printf("请输入发帖总和:"); 15 scanf("%d",&len); 16 int * shuiwang=new int [len]; 17 printf("请输入发帖人ID:"); 18 for(int m=0;m<len;m++) 19 { 20 scanf("%d",&shuiwang[m]); 21 } 22 23 for(int i=0;i<len;i++) 24 { 25 /*先将ID列表初始化,找出三个不同的ID*/ 26 if(idsum[0]==0 && shuiwang[i]!=ID[1] && shuiwang[i]!=ID[2]) 27 { 28 idsum[0]=1; 29 ID[0]=shuiwang[i]; 30 } 31 else if(idsum[1]==0 && shuiwang[i]!=ID[0] && shuiwang[i]!=ID[2]) 32 { 33 idsum[1]=1; 34 ID[1]=shuiwang[i]; 35 } 36 else if(idsum[2]==0 && shuiwang[i]!=ID[0] && shuiwang[i]!=ID[1]) 37 { 38 idsum[2]=1; 39 ID[2]=shuiwang[i]; 40 } 41 /*开始进行查找,不同标志idsum+1,相同标志-1*/ 42 else if(shuiwang[i]!=ID[0] && shuiwang[i]!=ID[1] && shuiwang[i]!=ID[2]) 43 { 44 idsum[0]--; 45 idsum[1]--; 46 idsum[2]--; 47 } 48 else if(shuiwang[i]==ID[0]) 49 { 50 idsum[0]++; 51 } 52 else if(shuiwang[i]==ID[1]) 53 { 54 idsum[1]++; 55 } 56 else if(shuiwang[i]==ID[2]) 57 { 58 idsum[2]++; 59 } 60 61 } 62 63 64 printf("%d\t%d\t%d\t\n",ID[0],ID[1],ID[2]); 65 66 return 0; 67 }
四、运行结果:
五、心得体会:
这次的扩展问题和之前的问题类似,方法都是一样,几个地方稍加修改就能解决这个问题。
虽然方法一样,但是在处理这个问题时具体的方法还是有不同,比如计数器的改变、一个人变成了三个人,将这三个人看成一个整体等。在解决的过程中,我对这个问题有了更深的了解,对之前的解决方法也更了解了。