在c++中使用嵌套循环求解一阶联立方程
Solving 1st degree simultaneous equations using nested loops in c++
我有一个问题,需要我编写一个程序来找到一对一阶联立方程的解。我必须详尽地测试x和y的所有值,才能找到整数解。两个方程的系数A、B和C都在一个名为"input.txt"的数据文本文件中
文本文件包含以下数据:
1 0 99
0 2 -100
以下是我的程序:
#include <stdio.h>;
#define FILENAME "input.txt"
int main() {
int A, B, C, x, y;
FILE *input;
input = fopen(FILENAME,"r");
fscanf(input,"%d%d%d", &A,&B,&C);
for(x = -100; x <= 100; x++)
for(y = -100; y <= 100; y++)
if(A*x+B*y==C){
fscanf(input,"%d%d%d", &A,&B,&C);
if(A*x+B*y==C)
printf("X=%d, Y=%dn", x, y);
}
return 0;
}
当我编译并运行程序时,我会得到
X=99, Y=-50
X=100, Y=-50
很明显,这个程序有一些错误。它们是什么?
此外,如果我想打印一条消息,说只能在[-100, 100]
范围内找到一次解决方案,我应该如何将这个printf函数插入程序中?
我已经有一段时间没有进行c风格的文件I/O了,但我很快就注意到了几个明显的错误:
- 您应该验证文件是否已打开
- 您应该验证fscanf每次读取预期的项目数
- 您可能需要%d个格式说明符之间的空格(对此不确定)
- 您不应该将第二组参数读取到与第一组参数相同的变量中
- 您应该只读取第二组参数一次(而不是在循环中有条件地读取)
此外,为什么需要使用嵌套循环?有更好的方法来解决这个问题。
编辑:提供的输出甚至来自示例代码吗?Y是如何得到-50的值的?
有一些问题。首先,它确实得到了正确的答案:99 x 1+-50 x 0==99
但是,在找到一个答案后,它重写了你原来的A、B、C值,并匹配了x的任何值。然后它读取文件的末尾,所以我不确定之后A、B和C的内容。
找到一个答案后,你应该停止搜索。
找到它的更好方法是:
Determinant = A1 * B2 - A2 * B1;
x = (C1 * B2 - C2 * B1) / Determinant;
y = (C2 * A1 - C1 * A2) / Determinant;
如果行列式为零,那么方程是平行的。
当然,你的大多数答案都不是整数,所以你可能喜欢使用浮点运算。
我非常喜欢在文件完成后关闭它们。
我不确定你想要什么,但在任何情况下,用int代替double都不会有用
#include <stdio.h>
#define FILENAME "input.txt"
int main()
{
double A, B, C; <----------------
int x, y; <-------------------
FILE *input;
input = fopen(FILENAME,"r");
fscanf(input,"%d%d%d", &A,&B,&C);
for(x = 0; x <= 100; x++)
for(y = 0; y <= 100; y++)
if(A*x+B*y==C){
fscanf(input,"%d%d%d", &A,&B,&C);
if(A*x+B*y==C)
printf("X=%d, Y=%dn", x, y);
}
return 0;
}
经过几天对代码的思考,我终于发现了问题所在。
错误在于将第二个fscanf函数放入循环中。当第二个fscanf函数在循环中时,它有第二次扫描的趋势,依此类推
我将参考我的代码进行解释。当程序成功找到满足第一组系数的第一组x和y,或方程x=99,即x=99和y=-100时,第二个fscanf函数将扫描第二组系数,或方程2y=-100。if函数将检查x和y的集合是否满足2y=-100。显然,x=99和y=-100不满足2y=-100,因此for循环函数将重复x=99和y=-99的过程。然而,从y=-99开始,第一个if函数中的A、B和C被分配给第二组系数,而不是第一组。fscanf函数将进行第二次扫描,其中没有第三组系数,因此它仍将扫描第二组系数。这导致生成满足y=-99的x和y的列表时出错,这不是程序应该做的!
因此,我尝试将第二个fscanf函数放在循环函数之外,它运行得很好。此外,为了打印一条消息,即在没有解决方案的情况下,只能在[-100100]范围内找到一次解决方案,我应用了布尔代数的概念。这是更正后的代码:
#include <stdio.h>
#define FILENAME "input.txt"
int main()
{
int A_1, B_1, C_1, A_2, B_2, C_2, x, y, NOSOLUTION;
FILE *input;
input = fopen(FILENAME,"r");
fscanf(input,"%d%d%d", &A_1,&B_1,&C_1);
fscanf(input,"%d%d%d", &A_2,&B_2,&C_2);
NOSOLUTION = 1;
for(x = -100; x <= 100 ; x++){
for(y = -100; y <=100; y++)
if(A_1*x+B_1*y==C_1 && A_2*x+B_2*y==C_2)
{
NOSOLUTION = 0;
printf("X=%d, Y=%dn", x, y);
}
}
if(NOSOLUTION == 1)
printf("Integer solution not found in range [-100, 100] n");
return 0;
}
尽管如此,还是非常感谢那些做出回应的人!
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 无法掌握嵌套循环的写作技巧
- 在 c++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 如何在CUDA中嵌套循环
- std::vector上的嵌套循环
- 具有动态数组分配的OpenMP嵌套循环
- 在c++中使用嵌套循环求解一阶联立方程