【问题标题】:Don't print space after last number [duplicate]不要在最后一个数字后打印空格[重复]
【发布时间】:2011-02-15 14:51:11
【问题描述】:

语言:C++ 您好,在下面的函数(代码块)中,我写了一行来打印字符之间的空格,但我不想在最后一个字符之后打印空格。我该如何解决这个问题?

bool perfecto(int n)
{
    int suma, i;
    suma = 0;
    for (i = 1; i < n; i++)
    {
        if (n % i == 0) 
        {
            suma += i;
            cout << i << " ";
        }
    }
    if (suma == n)
        return true;
    else
        return false;
}

最好的问候。 天使曼努埃尔。

【问题讨论】:

标签: c++


【解决方案1】:

最简单的方法是扭转问题:如果您只在打印数字之前(而不是之后)打印空格,那么它就变成了如何不打印第一次,这要容易得多。

我会让你弄清楚:)

【讨论】:

    【解决方案2】:
    bool perfecto(int n)
    {
        int suma, i;
        suma = 0;
        bool first = true;
        for (i = 1; i < n; i++)
        {
            if (n % i == 0) 
            {
                suma += i;
    
                if ( !first )
                {
                    cout << " ";
                }
    
                cout << i;
    
                first = false;
            }
        }
        if (suma == n)
            return true;
        else
            return false;
    }
    

    【讨论】:

    • 谢谢,您的回答有效。最好的问候
    • 那么接受他的回答吧!虽然尼克确实拥有成为唯一没有错误的代码的道德胜利,但我相信他也会欣赏绿色勾号。
    【解决方案3】:

    您可以检查 i 是否等于 n - 1 并且在这种情况下不打印它,或者类似

    std::cout << "1";
    for (int i = 2; i < n; ++i)
    {
        std::cout << " " << i;
    }
    

    在第二种情况下,您必须注意 n 小于等于 1 的情况

    【讨论】:

    • 他没有打印所有数字,只是打印因子。
    【解决方案4】:

    有多种选择。在这种情况下,可能最简单的方法是在除第一个元素之外的元素之前打印空格并使用标志来跟踪第一个元素:

    bool perfecto(int n)
    {
        int suma, i;
        suma = 0;
        bool first = true;
        for (i = 1; i < n; i++)
        {
            if (n % i == 0) 
            {
                suma += i;
                if(!first)
                {
                    std::cout << " ";
                }
                else first = false;
                cout << i;
            }
        }
        if (suma == n)
            return true;
        else
            return false;
    }
    

    编辑:其他流行的替代方法是完全打印第一个项目并且在循环外完全没有分隔符,然后在循环内您总是可以预先打印项目而根本没有 if-check。这种方法不适用于您的循环,因为您并不总是知道第一个项目何时打印。您还可以创建包装器ostream,例如跟踪其内部打印状态并知道何时放置空格的类。

    【讨论】:

    • 在这些情况下,我喜欢在循环之前使用char * space = "",而不是使用 bool 和 if 语句,然后在循环末尾放置 space = " "。它可能会产生微小的性能差异或根本没有,但我认为它更具可读性。
    • 谢谢,您的回答有效。最好的问候
    【解决方案5】:

    替换此行:cout &lt;&lt; i &lt;&lt; " "; 与:

    cout << i;
    
    if (i == n-1)
      cout << endl;
    else
      cout << " ";
    

    【讨论】:

    • 反例:n = 6,输出为1 2 3 。您的代码不会消除尾随空格。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2021-06-07
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多