【问题标题】:While loop task in c++C ++中的while循环任务
【发布时间】:2018-09-01 11:21:15
【问题描述】:

我是 C++ 的初学者,我在使这段代码按我想要的方式工作时遇到问题。任务是编写一个程序,将所有自然数乘以加载的数 n。

为了让它打印出正确的结果,我将x 除以n(参见下面的代码)。如何让它打印 x 而不必将其除以 n 以获得正确答案?

#include<iostream>
using namespace std;
int main(){
    int n,x=1;
    int i=0;
    cout<<"Enter a number bigger than 0:"<<endl;
    cin>>n;
    while(i<n){
        i++;
        x=i*x;  
    };
    cout<<"The result is: "<<x/n<<endl;
    return 0;
}

【问题讨论】:

  • 您可以将条件更改为i &lt; n-1 或初始化int i = 1 而不是0,并在操作后移动您的增量
  • @Sirmyself 这应该是一个答案!
  • @scohe001 当人们强迫你不要偷懒时的感觉^^
  • @scohe001 你去:两个答案!耶!

标签: c++ while-loop counter cout


【解决方案1】:

首先,您最好尽快习惯一个原则:始终检查用户输入的正确性!

cin >> n;
if(cin && n > 0)
{
    // valid
}
else
{
    // appropriate error handling
}

不确定,为什么需要一个 while 循环?在这种情况下,for 循环肯定更好:

int x = 1;
for(int i = 2; i < n; ++i)
   x *= i;

如果您仍然想要 while 循环:从 i == 2 开始(无论如何 1 是中性的)然后递增:

i = 2;
while(i < n)
{
    x *= i;
    ++i;
}

如果是n == 1,则根本不会输入循环(任一变体),你很好......

【讨论】:

  • 我宁愿有if (!cin || n &lt; 0) 和错误处理而不是if/'else`
【解决方案2】:

您已经有两个非常好的选择,但是当您对编程足够自在时,您可能想看看另一个选择:

unsigned factorial(unsigned value)
{
    if (value <= 1) 
    {
        return 1;
    }
    else
    {
        return value * factorial(value - 1);
    }
}

这是一个递归函数,在适当的时候使用它是一种简洁(不幸的是,这里不可能是这种情况,因为执行堆栈可能会变得如此之大,以至于在你完成之前填满你的内存。但你可以检查一下了解有关递归函数的更多信息)

当您的内存已满时,您的应用就会因所谓的堆栈溢出而崩溃。

【讨论】:

  • ...除非tail call optimised...
  • @Aconcagua 是的,但是这个例子不是,而且是一个更简单的例子,可以理解与之相关的递归和堆栈溢出风险
  • 不打算批评(实际上,我当时是两个支持者之一...),而是提供附加信息...鉴于answer很好地解释了为什么不这样做以及如何获得它...顺便说一句,实际上,我们计算了factorial,尽管指数也可以很容易地递归计算(return base * exponential(base, exp - 1);)...
  • 我的错:我只是记错了(我更正了我的答案)
  • 为了正确起见:您可能会在 value &lt;= 1 上返回 1,因为 0! 也是 1... 我们是否希望为负值返回 0 以指示非法输入(本来不会unsigned int 的问题...)?作为 C++,我们也可能抛出适当的异常......
【解决方案3】:

我怎样才能使它在最后一个cout 我只能放 x 而不必将 x 除以 n 以获得正确答案?

最好使用for 循环。

// This stops when i reaches n. 
// That means, n is not multiplied to the result when the loop breaks.
for (int i = 1; i < n; ++i )
{
   x *= i;
}

cout << "The result is: " << x <<endl;

【讨论】:

  • 即使你的答案没有错,你也没有解释他做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2022-01-21
  • 2013-02-22
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多