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

如何为C++线性不定方程求解程序添加合法整数值输入校验?

为线性不定方程求解代码添加输入校验功能

现有一段求解线性不定方程的C++代码,需要添加输入校验功能:仅允许用户输入合法整数值,若输入字母、非数字字符或小数(如"3.00"),则显示错误信息并要求重新输入。原代码如下:

#include <iostream>
#include <cmath>

using namespace std;

long long byaka(long long a, long long b, long long& k, long long& w)
{
    if (b == 0)
    {
        k = 1;
        w = 0;
        return a;
    }
    long long d = byaka(b, a % b, k, w);
    k -= (a / b) * w;
    swap(k, w);
    return d;
}

int main() 
{
    long long a, b, c, k, w, d;
    cout << "A B C: \n";
    cin >> a >> b >> c;
    d = byaka(a, b, k, w);
    while (c % d != 0) 
    {
        cout << "Impossible! Vvedite A B C: \n";
        cin >> a >> b >> c; 
        d = byaka(a, b, k, w);
    }
    long long t = c / d * k, t2 = b / d;
    if (t == 0) cout << 0 << " " << c / d * w;
    if (t > 0) cout << t + t2 * (-(t / t2)) << " " << c / d * w - a / d * (-(t / t2));
    if (t < 0) cout << t + t2 * (-((t - t2 + 1) / t2)) << " " << c / d * w - a / d * ((-((t - t2 + 1) / t2)));
}

实现思路

要实现严格的整数输入校验,需处理两种核心异常:输入非数字字符、输入含小数点的小数。通过封装输入校验函数完成,核心步骤如下:

  1. 尝试用cin读取long long值,若读取失败(输入非法字符),重置输入流状态并清空缓冲区残留内容。
  2. 若读取成功,检查输入流中是否有剩余字符(如小数点),确保输入是纯整数。
  3. 循环校验流程,直到用户输入合法整数。

修改后的完整代码

#include <iostream>
#include <cmath>
#include <limits>
#include <string>

using namespace std;

// 原扩展欧几里得算法函数保留
long long byaka(long long a, long long b, long long& k, long long& w)
{
    if (b == 0)
    {
        k = 1;
        w = 0;
        return a;
    }
    long long d = byaka(b, a % b, k, w);
    k -= (a / b) * w;
    swap(k, w);
    return d;
}

// 校验并获取单个合法long long整数
long long getValidLongLong(const string& prompt) {
    long long num;
    while (true) {
        cout << prompt;
        cin >> num;
        
        // 处理非数字输入
        if (cin.fail()) {
            cout << "错误:请输入合法整数!\n";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            continue;
        }
        
        // 处理小数或多余字符输入
        char remaining;
        if (cin.get(remaining) && remaining != '\n') {
            cout << "错误:请输入纯整数,禁止小数或多余字符!\n";
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            continue;
        }
        
        return num;
    }
}

// 批量获取合法的A、B、C值
void getValidABC(long long& a, long long& b, long long& c, const string& prompt) {
    cout << prompt << "\n";
    a = getValidLongLong("输入A: ");
    b = getValidLongLong("输入B: ");
    c = getValidLongLong("输入C: ");
}

int main() 
{
    long long a, b, c, k, w, d;
    
    // 首次输入校验
    getValidABC(a, b, c, "请输入A B C的值");
    d = byaka(a, b, k, w);
    
    // 无解时重新输入并校验
    while (c % d != 0) 
    {
        cout << "Impossible! 请重新输入A B C:\n";
        getValidABC(a, b, c, "");
        d = byaka(a, b, k, w);
    }
    
    // 计算并输出解
    long long t = c / d * k, t2 = b / d;
    if (t == 0) cout << 0 << " " << c / d * w;
    if (t > 0) cout << t + t2 * (-(t / t2)) << " " << c / d * w - a / d * (-(t / t2));
    if (t < 0) cout << t + t2 * (-((t - t2 + 1) / t2)) << " " << c / d * w - a / d * ((-((t - t2 + 1) / t2)));
}

代码说明

  • getValidLongLong:负责单个整数的校验,覆盖非数字、小数、多余字符等异常输入场景。
  • getValidABC:封装三个整数的输入流程,提升代码可读性。
  • 输入流处理:通过cin.clear()重置错误状态,cin.ignore()清空缓冲区,避免后续读取受残留输入影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:55:17