如何修复这个循环
How to fix this loop
我无法初始化 i 并更改 x 的值
我试图找到阶乘形式的逆序
#include <iostream>
using namespace std;
void main()
{
int x, i;
cin >> x;
float fact = x*i;
do {
fact = fact*i;
i = x -1;
--x;
} while( x >= 0 );
cout << fact << endl;
}
我期待5的输出! = 120
稍作修改的版本:(不检查溢出)
#include <iostream>
using namespace std;
int factorial (int x){ // a recursive function
int res = 0;
if (x ==1) return 1;
else
return x * factorial (x -1); // call the function, with the immediate previous number
}
int main(void)
{
int x = 0;
int fact = -1;
cin>>x;
fact = factorial(x);
cout<<fact<<endl;
}
这里不需要额外的变量。
删除变量 i
,因为我们不需要它。还要更正 while
循环中的条件,因为我们不需要 fact*0
int main() {
int x;
std::cin >> x;
float fact = 1;
do {
fact = fact * x;
x--;
} while (x > 0);
std::cout << fact << std::endl;
}
#include<iostream>
using namespace std;
int main()
{
int x,i=1;
cin>>x;
float fact = x*i;
do{
fact=fact*i;
i=x-1;
--x;
}while (x>0);
if (x == 0)
fact = 1;
cout<<fact<<endl;
}
对您的代码进行了一些小改动。这可能会有所帮助:)
您没有初始化 i
并且您的算法存在轻微缺陷。代码中注释:
#include <iostream>
int main() // void isn't valid
{
int i = 1; // initialize
int x;
std::cin >> x;
float fact = (x * i);
do {
fact = fact * i;
i = x - 1;
--x;
} while(x > 0); // if x==0 is accepted it means i==0 next round and "fact = fact * 0"
std::cout << fact << "\n";
}
您可以改为编写这样的函数:
#include <limits> // std::numeric_limits
float fact(int x) {
float fact = 1.f;
if(x < 0) { // let's not deal with negative factorials
fact = std::numeric_limits<float>::quiet_NaN();
} else {
for(; x > 0; --x) {
fact *= static_cast<float>(x);
}
}
return fact;
}
并检查它是否正常:
int main() {
for(int i = -1; i < 10; ++i) {
std::cout << i << "\t" << fact(i) << "\n";
}
}
输出:
-1 nan
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
我无法初始化 i 并更改 x 的值 我试图找到阶乘形式的逆序
#include <iostream>
using namespace std;
void main()
{
int x, i;
cin >> x;
float fact = x*i;
do {
fact = fact*i;
i = x -1;
--x;
} while( x >= 0 );
cout << fact << endl;
}
我期待5的输出! = 120
稍作修改的版本:(不检查溢出)
#include <iostream>
using namespace std;
int factorial (int x){ // a recursive function
int res = 0;
if (x ==1) return 1;
else
return x * factorial (x -1); // call the function, with the immediate previous number
}
int main(void)
{
int x = 0;
int fact = -1;
cin>>x;
fact = factorial(x);
cout<<fact<<endl;
}
这里不需要额外的变量。
删除变量 i
,因为我们不需要它。还要更正 while
循环中的条件,因为我们不需要 fact*0
int main() {
int x;
std::cin >> x;
float fact = 1;
do {
fact = fact * x;
x--;
} while (x > 0);
std::cout << fact << std::endl;
}
#include<iostream>
using namespace std;
int main()
{
int x,i=1;
cin>>x;
float fact = x*i;
do{
fact=fact*i;
i=x-1;
--x;
}while (x>0);
if (x == 0)
fact = 1;
cout<<fact<<endl;
}
对您的代码进行了一些小改动。这可能会有所帮助:)
您没有初始化 i
并且您的算法存在轻微缺陷。代码中注释:
#include <iostream>
int main() // void isn't valid
{
int i = 1; // initialize
int x;
std::cin >> x;
float fact = (x * i);
do {
fact = fact * i;
i = x - 1;
--x;
} while(x > 0); // if x==0 is accepted it means i==0 next round and "fact = fact * 0"
std::cout << fact << "\n";
}
您可以改为编写这样的函数:
#include <limits> // std::numeric_limits
float fact(int x) {
float fact = 1.f;
if(x < 0) { // let's not deal with negative factorials
fact = std::numeric_limits<float>::quiet_NaN();
} else {
for(; x > 0; --x) {
fact *= static_cast<float>(x);
}
}
return fact;
}
并检查它是否正常:
int main() {
for(int i = -1; i < 10; ++i) {
std::cout << i << "\t" << fact(i) << "\n";
}
}
输出:
-1 nan
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880