题目要求:大水王消失,出现三个小水王,所发帖数超过所有帖数的四分之一
设计思路:这次的算法沿用上一次,只是水王个数增加,继续使用同加异减的方法,只不过增加选择分支语句,精髓还是一样的。
代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
char iD[20][20];//每行读入的字符
string ID[20];//字符串ID
int a=0;
ifstream out("ID.txt");
if(!out)
{
cerr<<"文件打开错误"<<endl;
return 1;
}
cout<<"ID表:"<<endl;
while(!out.eof())
{
out>>iD[a];
ID[a]=iD[a];//将字符数组转换为字符串
cout<<ID[a]<<endl;//输出ID表
a++;
}
string king[3];//水王
int count[3]={0,0,0};//计数
for(int i=0;i<20;i++)
{
if(count[0]==0)//计数为零,将当前ID设为水王
{
count[0]=1;
king[0]=ID[i];
}
else if(count[1]==0)//计数为零,将当前ID设为水王
{
count[1]=1;
king[1]=ID[i];
}
else if(count[2]==0)//计数为零,将当前ID设为水王
{
count[2]=1;
king[2]=ID[i];
}
else if(king[0]==ID[i])//若当前ID和水王是同一人,则改水王的计数加一
{
count[0]++;
}
else if(king[1]==ID[i])//若当前ID和水王是同一人,则改水王的计数加一
{
count[1]++;
}
else if(king[2]==ID[i])//若当前ID和水王是同一人,则改水王的计数加一
{
count[2]++;
}
else//若当前ID不属于水王,则水王ID均减一
{
count[0]--;
count[1]--;
count[2]--;
}
}
cout<<"水王为:"<<king[0]<<" "<<king[1]<<" "<<king[2]<<endl;
out.close();
return 0;
}
运行结果:

经验总结:
做程序要学会举一反三,很多东西都是大同小异,当老师说了这个题目,我很快就想到应该是一样的,也许是一种惯性,一个使顺了就不愿意换,不过这样很简单。所以呢就是大道至简,越简单越快捷。