• 找水王


    一.设计思路

      1.由于题设中给出条件“水王”的发贴数超过列表中总发贴数的一半(即最少比一半多一个);

      2.假设“水王”的发贴数恰好是总发贴数的一半多一个,而“水王”的贴子是均匀分布在贴子列表中的,即每两个相邻的贴子中总有一个“水王”的贴子;

        a.如果贴子总数为奇数,且每两个相邻贴子中总是“水王”的贴子在前(在后亦然),则最后必然剩下一个“水王”的贴子;

        b.如果贴子总数为偶数,且每两个相邻贴子中总是“水王”的贴子在前(在后亦然),则最后必然剩下两个“水王”的贴子。

      3.如果“水王”的发贴数更多时,则两个相邻贴子都是“水王”的概率更高;

      4.根据以上的分析,可以用一个函数按序号依次将贴子列表中的每两个相邻贴子的ID比较,如果相同,则保留一个ID号存放于一个一维数组中;如果不相同,

    则跳过,进行下面两个相邻贴子ID号的比较;

      5.如果所得一维数组中只有一个元素,则该ID号即为“水王”的ID号;如果所得一维数组中超过一个元素,则将该一维数组递归调用比较函数,直到一维数组中只有一个元素。

    二.代码实现

     1 #include<iostream>
     2 #include<fstream>
     3 #include<string>
     4 #define N 100
     5 using namespace std;
     6 
     7 string findM(string str[],int num)
     8 {
     9     string real;    //记录查找到的水王ID号
    10     string next[N];    //按序号将ID号两两比较,若相同,则将该ID号保留一个存放于next[N]中;若不相同,则跳过
    11     int i;
    12     int length=0;    //记录每次生成的数组next的长度
    13     for (i = 0; i < num; i+=2)
    14     {
    15         if ((str[i] == str[i + 1]&&i+1<num)||i+1==num)
    16         {
    17             next[length] = str[i];
    18             length++;
    19         }
    20     }
    21     //当数组next中只有一个元素时,该元素即为所找水王
    22     if (length == 1)
    23     {
    24         real = next[0];
    25     }
    26     else if (length == 0)
    27     {
    28         real = "" ;
    29     }
    30     else
    31     {
    32         real=findM(next, length);
    33     }
    34     return real;
    35 }
    36 
    37 int main()
    38 {
    39     //ifstream file("myfile.txt");
    40     ifstream file;
    41     file.open("myfile.txt");
    42     if (!file)
    43     {
    44         cout << "文件不存在!" << endl;
    45     }
    46     else
    47     {
    48         int num[N];    //存放序号
    49         string str[N];    //存放各序号对应的ID号
    50         string gfind;    //获得的水王的ID号
    51         int n = 0;    //存放发帖表行数
    52         while (file >> num[n] >> str[n])
    53         {
    54             n++;
    55         }
    56         if (n > 0)
    57         {
    58             cout << "发帖表信息:" << endl;
    59             cout << "序号	贴主ID号" << endl;
    60             for (int i = 0; i < n; i++)
    61             {
    62                 cout << num[i] << "	" << str[i] << endl;
    63             }
    64             cout << "
    ";
    65             gfind = findM(str, n);
    66             if (gfind == "")
    67             {
    68                 cout << "此列表中不存在这样的水王(发贴数超过总贴子数的1/2)!" << endl;
    69             }
    70             else
    71             {
    72                 cout << "水王是:";
    73                 cout << gfind << endl;
    74             }
    75         }
    76         else
    77         {
    78             cout << "文件为空!" << endl;
    79         }
    80     }
    81     file.close();
    82     return 0;
    83 }

    三.实验截图

    1.测试数据一

    2.测试数据二

    3.空文件测试

    4.错误列表(无水王)测试

    四.个人总结

      本次实验刚开始想了挺长时间,都没有想出什么思路,后来通过老师的提示才有了思路,程序写完之后才发现,其实难度也确实不大。

  • 相关阅读:
    一起谈.NET技术,验证.NET强命称的思路和实例 狼人:
    一起谈.NET技术,基于SQL Server 2008 Service Broker构建企业级消息系统 狼人:
    一起谈.NET技术,一句代码实现批量数据绑定[下篇] 狼人:
    一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo 狼人:
    一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(六)流光追影 狼人:
    一起谈.NET技术,ASP.NET下用URLRewriter重写二级域名 狼人:
    这样覆写Object类的toString方法对吗
    【Cocos2DX 】初窥门径(7)无限地图滚动
    poj2975——Caesar密码
    [置顶] poi最简单易学解析xls代码
  • 原文地址:https://www.cnblogs.com/pengchengwanli/p/5509627.html
Copyright © 2020-2023  润新知