#include <iostream> using namespace std; void gcd(){ int a,b,hcf; for (int i = 1; i <= b; ++i) { if (a % i == 0 && b % i ==0) { hcf = i; } } } void pirm(){ int a,b,n,hcf; for (int a=1;a<n;a++){ for (int b=1;b<n;b++){ gcd(); if (hcf==1) { cout << a << " and " << b << endl; } } } } int main(){ int n,a,b,i,hcf; cout << "Enter a natural n, less than 100" << endl; cin >> n; if (n>=1 && n<100){ pirm(); } else cout << "You didn't enter a natural number" <<endl; }
当我运行它并输入一个数字时,它什么也没做。任务如下: 用户输入一个小于100的自然N.找到并输出所有&lt; 100。
正如您可以从代码中看出的那样,我是C ++的完整新手。只是想知道为什么节目&#34;停止&#34;或者我把代码搞砸了。非常感谢任何帮助。
答案 0 :(得分:1)
这里有很多问题。
首先,直接回答你的问题:你的程序永远不会打印,因为它永远不会执行print语句。如果输入自然数,但hcf
永远不等于1,则永远不会打印任何内容。
现在问题变成为什么hcf
永远不会是1?这就是我们开始遇到更多代码问题的地方。主要的误解似乎与范围有关。如果在函数内声明变量,它们在函数的“范围”内 - 函数可以使用它们,函数内的任何范围都可以使用它们(例如循环和条件),但是没有外部范围可以使用它们。您多次声明a
,b
和hcf
,但您只能在gcd()
中使用它们。这不仅是不必要的,而且至关重要的是,它们是不同的变量。您更改hcf
范围内的gcd()
,但hcf
中的pirm()
保持不变!
有很多方法可以做你想做的事情。与您已有的最接近的是让gcd()
通过引用获取参数。如果您将gcd()
的声明更改为void gcd(int a, int b, int &hcf)
,并且不在函数的第一行重新声明这些变量,那么您就可以修改hcf
以某种方式即使功能超出范围也会坚持下去。然后,您需要将第15行的通话更改为gcd(a,b,hcf);
。
您的算法也可以改进,但我相信它仍然有效。如果您对找到gcd的更规范的方式感兴趣,请尝试查看Euclid's algorithm。
答案 1 :(得分:0)
您应该学习如何将参数传递给函数。为您更正了代码,似乎正在运行:
#include <iostream>
void gcd(int &hcf, int a, int b)
{
for (int i = 1; i <= b; ++i)
{
if (a % i == 0 && b % i == 0)
{
hcf = i;
}
}
}
void pirm(int n)
{
int hcf;
for (int a = 1; a<n; a++)
{
for (int b = 1; b<n; b++)
{
gcd(hcf, a, b);
if (hcf == 1)
{
std::cout << a << " and " << b << std::endl;
}
}
}
}
int main()
{
int n;
std::cout << "Enter a natural n, less than 100" << std::endl;
std::cin >> n;
if (n >= 1 && n<100)
{
pirm(n);
}
else
std::cout << "You didn't enter a natural number" << std::endl;
system("pause");
return 0;
}