质因数的 C++ 程序
C++ Program for Prime Factors
我正在尝试构建一个程序,要求用户输入一个正整数,然后输出该数字的质因数。我给用户三次尝试输入有效输入或程序结束。所以任何负整数和非整数以及其他字符如字母都会给出错误信息。我快到了,但我的输出不会如我所愿。它将小数视为整数,负数不会返回错误。
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
using namespace std;
int main()
{
int num,i,flag,n;
//executes loop if the input fails (e.g., no characters were read)
while (cout << "Enter a number: " && !(cin >> num))
{
cin.clear(); //clear bad input flag
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //discard input
cout << "Invalid input, please re-enter: \n";
}
i=2;
n=num;
cout<< "\nThe Prime factors of "<< num << " are:"<< endl;
while(i<=num)
{
flag=0;
while(n%i==0)
{
n=n/i;
flag++;
}
if(flag>0)
{
cout <<i<< endl;
}
++i;
}
system("PAUSE");
return 0;
}
您没有收到输入负数的错误消息,因为您没有在输入验证中检查负数。您可以添加到 while 条件中以检查负输出:
while (cout << "Enter a number: " && (!(cin >> num) || num <= 0))
您没有捕捉到十进制数输入的原因是 cin
成功地将输入转换并存储到小数点,然后停止,将输入的其余部分留在缓冲区中。我们可以看到:
#include <iostream>
int main()
{
int foo;
double bar;
std::cin >> foo;
std::cin >> bar;
std::cout << foo << std::endl;
std::cout << bar;
}
输入:
5.82
输出:
5
0.82
您可以在 while 循环条件中包含一个检查,以查看流中是否有更多输入在等待
while (cout << "Enter a number: " && (!(cin >> num) || num <= 0 || cin.get() != '\n'))
至于只循环三次,你可以在程序中添加一个计数器,并在每次循环体执行时递增计数器。一旦计数器达到 3,您将退出程序
int counter = 0;
while (cout << "Enter a number: " && (!(cin >> num) || num <= 0 || cin.get() != '\n'))
{
if (counter == 3)
return 0; // exit
cin.clear(); //clear bad input flag
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //discard input
cout << "Invalid input, please re-enter: \n";
counter++;
}
!(cin >> num)
仅在cin
无法将输入字符数据插入到num中时为真,即int
。负整数(如 -12)和小数(如 3.14)都可以塞入带符号的 int
中。十进制数量有效,因为可以通过截断将 float
s 强制转换为 int
s。
要执行您想要的操作,您需要首先将控制台输入捕获为字符串,然后尝试解析出一个正整数。看看 How do I check if a C++ string is an int? 和 boost::lexical_cast
(如果 boost 是一个选项)。
我正在尝试构建一个程序,要求用户输入一个正整数,然后输出该数字的质因数。我给用户三次尝试输入有效输入或程序结束。所以任何负整数和非整数以及其他字符如字母都会给出错误信息。我快到了,但我的输出不会如我所愿。它将小数视为整数,负数不会返回错误。
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
using namespace std;
int main()
{
int num,i,flag,n;
//executes loop if the input fails (e.g., no characters were read)
while (cout << "Enter a number: " && !(cin >> num))
{
cin.clear(); //clear bad input flag
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //discard input
cout << "Invalid input, please re-enter: \n";
}
i=2;
n=num;
cout<< "\nThe Prime factors of "<< num << " are:"<< endl;
while(i<=num)
{
flag=0;
while(n%i==0)
{
n=n/i;
flag++;
}
if(flag>0)
{
cout <<i<< endl;
}
++i;
}
system("PAUSE");
return 0;
}
您没有收到输入负数的错误消息,因为您没有在输入验证中检查负数。您可以添加到 while 条件中以检查负输出:
while (cout << "Enter a number: " && (!(cin >> num) || num <= 0))
您没有捕捉到十进制数输入的原因是 cin
成功地将输入转换并存储到小数点,然后停止,将输入的其余部分留在缓冲区中。我们可以看到:
#include <iostream>
int main()
{
int foo;
double bar;
std::cin >> foo;
std::cin >> bar;
std::cout << foo << std::endl;
std::cout << bar;
}
输入:
5.82
输出:
5
0.82
您可以在 while 循环条件中包含一个检查,以查看流中是否有更多输入在等待
while (cout << "Enter a number: " && (!(cin >> num) || num <= 0 || cin.get() != '\n'))
至于只循环三次,你可以在程序中添加一个计数器,并在每次循环体执行时递增计数器。一旦计数器达到 3,您将退出程序
int counter = 0;
while (cout << "Enter a number: " && (!(cin >> num) || num <= 0 || cin.get() != '\n'))
{
if (counter == 3)
return 0; // exit
cin.clear(); //clear bad input flag
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //discard input
cout << "Invalid input, please re-enter: \n";
counter++;
}
!(cin >> num)
仅在cin
无法将输入字符数据插入到num中时为真,即int
。负整数(如 -12)和小数(如 3.14)都可以塞入带符号的 int
中。十进制数量有效,因为可以通过截断将 float
s 强制转换为 int
s。
要执行您想要的操作,您需要首先将控制台输入捕获为字符串,然后尝试解析出一个正整数。看看 How do I check if a C++ string is an int? 和 boost::lexical_cast
(如果 boost 是一个选项)。