You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序数字位条件判断异常:始终输出DA问题排查

程序始终输出DA的问题排查与修复

需求说明

编写程序读取两个自然数,检查第一个数奇数位置的所有数字是否都存在于第二个数的偶数位置中(从左数第一个数字为第0位)。满足条件输出DA,否则输出NE。

问题描述

无论输入什么测试用例,程序始终输出DA。原实现思路是通过嵌套循环遍历两个数字的各位,使用firstnumbercounter判断第一个数当前数字的位置是奇数还是偶数,进而检查对应数字是否匹配。

原代码

#include <iostream>
#include <cstring>

using namespace std;

int main() {
    int number1, number2;
    cin >> number1 >> number2;

    int firstnumbercounter = 0;
    bool istrue = false;

    while (number1 > 0) {
        int temp = number2;
        while (temp > 0) {
            if (firstnumbercounter % 2 == 0) {
                int number1_digit = number1 % 10;
                int number2_digit = temp % 10;

                if (number1_digit == number2_digit) {
                    istrue = true;
                    break; 
                }
            }
            temp /= 10;
        }

        number1 /= 10;
        firstnumbercounter++;
    }

    if (istrue) {
        cout << "DA" << endl;
    } else {
        cout << "NE" << endl;
    }

    return 0;
}

问题根源

  1. 位置判断完全错误:你用firstnumbercounter % 2 == 0判断第一个数的奇数位置,但循环是从右往左取数字,firstnumbercounter从0开始计数,对应原数字的偶数位置(从右数),和需求中“从左数的奇数位置”完全颠倒。同时你根本没判断第二个数的位置是否为偶数,直接拿所有数字比较,不符合需求。
  2. 布尔变量逻辑反了:istrue初始为false,只要找到一个匹配就设为true且不会再改变。但需求是所有第一个数奇数位置的数字都要满足,只要有一个不满足就该输出NE,正确逻辑应该是初始设为true,发现不匹配就设为false。
  3. 数字遍历方向导致位置混乱:用number%10取的是数字的最后一位,位置计数和从左数的位置完全错位,比如数字123,从左数第0位是1,但你先取到3,此时计数器是0,完全不符合位置要求。

修复方案

直接用字符串处理更简单,字符串索引天然对应从左数的位置:

  1. 把两个数字转成字符串,直接按索引访问每一位。
  2. 先收集第二个数所有偶数索引(0、2、4...)的数字,存入集合方便快速查找。
  3. 遍历第一个数的奇数索引(1、3、5...)的数字,检查是否都在第二步的集合里。
  4. 布尔变量初始设为true,只要有一个数字不在集合里就设为false,提前终止检查。

修复后的代码

#include <iostream>
#include <string>
#include <unordered_set>

using namespace std;

int main() {
    int num1, num2;
    cin >> num1 >> num2;

    // 转字符串,直接用索引对应从左数的位置
    string s1 = to_string(num1);
    string s2 = to_string(num2);

    // 存储第二个数偶数位置的所有数字
    unordered_set<char> s2_even_digits;
    for (int i = 0; i < s2.size(); i += 2) {
        s2_even_digits.insert(s2[i]);
    }

    bool all_match = true;
    // 检查第一个数所有奇数位置的数字
    for (int i = 1; i < s1.size(); i += 2) {
        if (s2_even_digits.find(s1[i]) == s2_even_digits.end()) {
            all_match = false;
            break; // 有一个不满足就无需继续检查
        }
    }

    cout << (all_match ? "DA" : "NE") << endl;

    return 0;
}

代码说明

  • 字符串索引直接对应从左数的位置,彻底解决位置判断混乱的问题。
  • unordered_set的查找效率为O(1),比嵌套循环遍历更高效。
  • 严格遵循需求:第一个数奇数位置(索引1、3...)的数字必须全部存在于第二个数的偶数位置(索引0、2...)中。

内容的提问来源于stack exchange,提问作者user23152261

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:28:11