投票统计工具

题目描述

实现一个简单的投票统计工具,投票规则如下:

  • 投票同意的人输入 1
  • 反对的人输入 0
  • 输入 -1 表示投票结束

根据投票结果输出:

  • 同意人数超过反对人数时输出 Yes
  • 反对人数超过同意人数时输出 No
  • 双方人数相等时输出 Tie

输入格式

一行中给出一系列投票值,以 -1 结束。

  • 1 表示同意
  • 0 表示反对
  • -1 表示投票结束

输出格式

  • 第一行输出投票结果:YesNoTie
  • 第二行输出同意人数和反对人数,用冒号 : 分隔

样例

样例输入1

1 0 0 1 1 -1

样例输出1

Yes
3:2

样例输入2

0 0 0 1 -1

样例输出2

No
1:3

样例输入3

1 1 1 0 0 0 -1

样例输出3

Tie
3:3

3 条评论

  • @ 2025-5-31 16:09:01

    代码解释

    这段C++程序实现了一个简单的投票统计工具,以下是对代码的详细解释:

    #include<iostream>
    using namespace std;
    int main(){
      int tongyi = 0;  // 存储同意的人数
      int fandui = 0;  // 存储反对的人数
      
      // 无限循环读取投票值,直到遇到-1结束
      while(true){
        int a;  // 用于接收用户输入的投票值
        cin>>a; // 读取输入
        
        // 当输入为-1时,跳出循环结束投票
        if(a == -1){
          break;
        }
        
        // 统计同意票数
        if(a == 1){
          tongyi += 1;
        }
        
        // 统计反对票数
        if(a == 0){
          fandui += 1;
        }
      }
      
      // 判断投票结果并输出
      if(tongyi > fandui){
        cout<<"Yes"<<endl;
      }else if(tongyi < fandui){
        cout<<"No"<<endl;
      }else{
        cout<<"Tie"<<endl;
      }
      
      // 输出同意和反对的具体票数
      cout<<tongyi<<":"<<fandui<<endl;
      
      return 0;
    }
    

    程序工作流程

    1. 初始化计数器

      • tongyi 变量用于记录同意票数(输入为1)
      • fandui 变量用于记录反对票数(输入为0)
    2. 投票输入循环

      • 使用 while(true) 创建无限循环持续读取输入
      • 每次读取一个整数 a
      • a-1,则使用 break 语句跳出循环结束投票
      • a1,同意票数 tongyi 加1
      • a0,反对票数 fandui 加1
    3. 结果判断与输出

      • 比较 tongyifandui 的大小
      • 输出相应结果(Yes/No/Tie)
      • 按格式输出具体票数(例如 3:2

    关键点说明

    1. 输入处理

      • 使用 -1 作为结束标记,这是常见的输入终止方式
      • 程序会忽略除0、1、-1之外的其他输入值(不会对其进行计数)
    2. 统计逻辑

      • 通过两个独立的 if 语句分别统计同意和反对票
      • 这种实现方式清晰直观,易于理解和维护
    3. 输出格式

      • 严格按照题目要求的格式输出结果和票数
      • 使用冒号 : 分隔同意和反对的票数

    这个程序结构简单,逻辑清晰,能够正确处理投票统计的核心需求。

    • @ 2025-5-31 15:57:25

      投票统计工具解题思路

      一、问题分析

      1. 核心任务:统计投票数据中同意(1)和反对(0)的票数,根据票数对比结果输出相应结论。
      2. 输入特点:输入以 -1 作为结束标志,需处理不定长度的输入数据。
      3. 输出要求:分两行输出结果(结论和票数对比),格式需严格符合要求。

      二、解题步骤拆解

      1. 数据存储与输入处理
      • 方案选择
        • 不存储数据:直接统计票数(适用于无需保存历史数据的场景)。
        • 存储数据:用数组或容器保存所有投票值(适用于需要后续数据处理的场景)。
      • 输入处理逻辑
        • 循环读取输入值,直到遇到 -1 时终止。
        • 过滤无效输入(非0、1、-1的值可忽略)。
      2. 票数统计逻辑
      • 维护两个计数器 yes_count(同意票数)和 no_count(反对票数)。
      • 遍历输入数据(或直接在输入时统计),遇到 1yes_count++,遇到 0no_count++
      3. 结果判断与输出
      • 比较 yes_countno_count
        • yes_count > no_count,输出 Yes
        • yes_count < no_count,输出 No
        • yes_count == no_count,输出 Tie
      • 按格式输出票数对比(如 3:2)。

      三、两种实现方案(以C++为例)

      方案1:直接统计(不存储数据)
      #include <iostream>
      using namespace std;
      
      int main() {
          int yes = 0, no = 0;
          int vote;
          while (cin >> vote && vote != -1) {  // 读取输入直到-1
              if (vote == 1) yes++;
              else if (vote == 0) no++;
          }
          // 判断结果
          if (yes > no) cout << "Yes\n";
          else if (yes < no) cout << "No\n";
          else cout << "Tie\n";
          // 输出票数
          cout << yes << ":" << no << endl;
          return 0;
      }
      
      • 优势:代码简洁,无需额外空间存储投票数据。
      • 适用场景:仅需统计结果,无需保留历史投票记录。
      方案2:数组存储(适用于需要数据回溯的场景)
      #include <iostream>
      using namespace std;
      
      int main() {
          const int MAX_SIZE = 1000;
          int votes[MAX_SIZE];
          int count = 0;
          int vote;
          
          // 读取投票并存储
          while (cin >> vote && vote != -1 && count < MAX_SIZE) {
              votes[count++] = vote;
          }
          
          // 统计票数
          int yes = 0, no = 0;
          for (int i = 0; i < count; i++) {
              if (votes[i] == 1) yes++;
              else if (votes[i] == 0) no++;
          }
          
          // 输出结果(同上)
          if (yes > no) cout << "Yes\n";
          else if (yes < no) cout << "No\n";
          else cout << "Tie\n";
          cout << yes << ":" << no << endl;
          return 0;
      }
      
      • 优势:可保存所有投票数据,便于后续扩展(如查看投票历史、排序等)。
      • 注意事项:需设定数组最大长度,避免越界。

      四、关键细节处理

      1. 输入终止条件:必须严格以 -1 作为结束标志,其他值(如0、1)需正常处理。
      2. 无效输入过滤:若输入非0、1、-1(如2、-2),程序应忽略该值,不影响统计结果。
      3. 边界情况
        • 无有效投票时(如输入 -1):yes=0no=0,输出 Tie0:0
        • 全为无效输入时(如 2 3 -1):处理逻辑同上。

      五、算法复杂度分析

      • 时间复杂度:O(n),其中 n 为有效投票数(需遍历所有输入值)。
      • 空间复杂度
        • 方案1:O(1)(仅使用几个计数器变量)。
        • 方案2:O(n)(需存储所有投票值,n 为最大投票数)。

      六、扩展思路

      1. 优化输入处理:使用 vector 替代固定长度数组,动态扩展存储容量。
      2. 增加异常处理:如限制投票人数、提示输入格式错误等。
      3. 功能扩展:添加投票结果可视化(如百分比显示)、投票历史查询等功能。
      • @ 2025-5-31 15:38:24

        根据你的需求,下面是使用C++实现的投票统计工具,使用数组来存储投票结果:

        #include <iostream>
        using namespace std;
        
        int main() {
            const int MAX_VOTES = 1000;  // 最大投票数
            int votes[MAX_VOTES];        // 存储投票结果的数组
            int count = 0;               // 实际投票数
            
            // 读取投票直到输入-1
            cout << "请输入投票结果(1=同意,0=反对,-1=结束):" << endl;
            int vote;
            while (true) {
                cin >> vote;
                if (vote == -1) break;  // 结束投票
                
                if (count < MAX_VOTES) {
                    votes[count] = vote;  // 存储有效投票
                    count++;
                } else {
                    cout << "投票数已达到最大值!" << endl;
                    break;
                }
            }
            
            // 统计票数
            int yesCount = 0;
            int noCount = 0;
            
            for (int i = 0; i < count; i++) {
                if (votes[i] == 1) {
                    yesCount++;
                } else if (votes[i] == 0) {
                    noCount++;
                }
                // 忽略其他无效值(非0非1)
            }
            
            // 输出结果
            if (yesCount > noCount) {
                cout << "Yes" << endl;
            } else if (yesCount < noCount) {
                cout << "No" << endl;
            } else {
                cout << "Tie" << endl;
            }
            
            cout << yesCount << ":" << noCount << endl;
            
            return 0;
        }
        

        代码说明:

        1. 数组存储投票结果

          • 使用int votes[MAX_VOTES]数组存储所有有效投票
          • count变量记录实际投票数量
        2. 输入处理

          • 通过循环持续读取输入,直到遇到-1
          • 验证投票数不超过数组最大容量
        3. 统计逻辑

          • 遍历数组统计同意(1)和反对(0)的票数
          • 忽略无效输入(非0和1的值)
        4. 结果输出

          • 根据统计结果输出"Yes"、"No"或"Tie"
          • 按格式输出具体票数

        使用示例:

        输入:

        1 0 0 1 1 -1
        

        输出:

        Yes
        3:2
        

        这个实现使用数组存储所有投票结果,相比原方案增加了数据存储功能,方便后续可能的扩展需求,如查看历史投票记录等。

        • 1