C 中的方程简化问题

问题描述 投票:0回答:1

我正在开发一个 C 程序,通过删除零系数项来简化数学方程。但是,我在第一个简化方程的输出中遇到了一个特定问题。
当使用提供的输入方程运行代码时,第一个简化方程不是我所期望的。这是程序的输出:

Original Equation: a + 0b = 0c + 2d + 0e + 0f
Simplified Equation: a+2d

Original Equation: a + b = 0c + 2d + 0e + 0f
Simplified Equation: a+b=2d

Original Equation: a + 2b = 0c + 2d + 0e + 2f
Simplified Equation: a+2b=2d+2f

Original Equation: a + 2b = 0c + 2d + 0e + 0f
Simplified Equation: a+2b=2d

但是,我预计第一个简化方程是:

Original Equation: a + 0b = 0c + 2d + 0e + 0f
Simplified Equation: a=2d

方程简化背后的逻辑涉及将原始方程中遇到的项添加到简化方程中,同时跳过系数为零的字母和值。应将

+
=
符号添加到简化方程中,因为它们在原始方程中找到。但是,如果原方程的最后一项是
0
后跟一个字母,则应消除最后一个
+
符号。

感谢您在识别和纠正我的实施中的问题方面提供的任何帮助。
以下是我正在使用的代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// Function to simplify the equation by removing terms with zero coefficients
void simplifyEquation(const char equation[]) {
    char simplifiedEquation[100]; // Arbitrary size for the resulting string
    int simplifiedPos = 0;
    int len = strlen(equation);
    int termFound = 0; // Flag to indicate if a significant term has been found

    // Traverse the original equation
    for (int i = 0; i < len; i++) {
        if (equation[i] == '+' || equation[i] == '=') {
            // If we encounter an operator (+ or =), check the captured term
            if (termFound) {
                // Add the operator to the simplified equation
                simplifiedEquation[simplifiedPos++] = equation[i];
                termFound = 0; // Reset the flag
            }
        } else if (isdigit(equation[i])) {
            // Check if the next character is '0'
            if (equation[i] == '0') {
                // Ignore this term (skip to the next space or operator)
                while (i < len && (equation[i] != ' ' && equation[i] != '+')) {
                    i++;
                }
                continue; // Move to the next iteration of the loop
            }
            // Build the term while encountering digits
            simplifiedEquation[simplifiedPos++] = equation[i];
            termFound = 1; // Indicate that we found a significant term
        } else if (isalpha(equation[i])) {
            // If we encounter a letter (variable), add it to the simplified equation
            simplifiedEquation[simplifiedPos++] = equation[i];
            termFound = 1; // Indicate that we found a significant term
        }
    }

    // Check if the last character is a '+' sign and remove it if so
    if (simplifiedPos > 0 && simplifiedEquation[simplifiedPos - 1] == '+') {
        simplifiedEquation[simplifiedPos - 1] = '\0'; // Replace the last '+' with null terminator
    } else {
        // Add null terminator to finalize the string
        simplifiedEquation[simplifiedPos] = '\0';
    }

    // Print the simplified equation
    printf("Original Equation: %s\n", equation);
    printf("Simplified Equation: %s\n", simplifiedEquation);
}

int main() {
    // Array of equations
    const char equations[][100] = {
        "a + 0b = 0c + 2d + 0e + 0f",
        "a + b = 0c + 2d + 0e + 0f",
        "a + 2b = 0c + 2d + 0e + 2f",
        "a + 2b = 0c + 2d + 0e + 0f"
    };

    // Process each equation in the array
    for (int i = 0; i < sizeof(equations) / sizeof(equations[0]); i++) {
        simplifyEquation(equations[i]);
        printf("\n"); // Print a blank line between equations
    }

    return 0;
}
c
1个回答
0
投票

如果您仅限于简单的线性方程,并且正在考虑方程的两侧(左右部分等号),您可以做两件事:

  • 将表达式树视为两个分支(一个用于等号的左侧部分,一个用于等号的右侧部分)
  • 将所有右侧项视为负数(更改其符号)

所以你的等式

a + 0b = 0c + 2d + 0e + 0f

可以对方程的每个边进行解析和求解,给出:

a = 2d

或者,首先:

a + 0b - 0c - 2d - 0e - 0f = 0

然后

a - 2d = 0

两种解决方案是等效的。

© www.soinside.com 2019 - 2024. All rights reserved.