棘手的设计练习

时间:2014-08-01 16:02:10

标签: php

Hello其他程序员。 我对如何在优雅的解决方案中解决这个问题感到有点困惑。 这是我正在研究的一本书的练习,但没有解决方案。 感谢有关如何解决此问题的任何帮助。这是:

编写一个程序,打印1到100之间的数字

对于三个打印“Hello”而不是数字的倍数。 对于五个打印“世界”的倍数。 对于三和五的倍数的数字打印“HelloWorld”。

感谢您的帮助

for ($i=1; $i<=100; $i++){
echo $i;
if(multiple_three($i) && multiple_five($i)) echo 'HelloWorld';
else{
    if(multiple_three($i)) echo 'Hello';
    if(multiple_five($i)) echo 'World';
 }
}

function multiple_three($i)
{
    if($i % 3 == 0) return true;
    else 
        return false;
}

function multiple_five($i)
{
    if($i % 5 == 0) return true;
    else 
        return false;
}

我提出了这些简单的解决方案,但我仍然没有解决我需要编写单词而不是数字的问题。在此代码中,编号无论如何都是

1 个答案:

答案 0 :(得分:0)

您没有按正确的顺序处理测试,而且您总是在没有任何测试的情况下打印该数字。根据您的解释,逻辑应该是这样的:

  • 如果number是3的倍数和5的倍数,则打印HelloWorld
  • 否则,如果它是3的倍数,请打印Hello。
  • 否则,如果它是5印刷世界的倍数。
  • 如果不满足这些条件,请打印该号码。

嗯,代码看起来与上面的解释完全相同

for ($i=1; $i<=100; $i++){
    if(multiple_three($i) && multiple_five($i)) {
        echo "HelloWorld\n";
    } else if (multiple_three($i)) {
        echo "Hello\n";
    } else if(multiple_five($i)) {
        echo "World\n";
    } else {
        echo $i . "\n";
    }
}

我还添加了一些换行符以改善输出。输出如下:

1
2
Hello
4
World
Hello
7
8
Hello
World
11
Hello
13
14
HelloWorld
16
...

在线测试:

http://sandbox.onlinephpfunctions.com/code/5adc36408c3067a93a75c20aa71d2aad510d6eba

编辑(脸颊):嗯,没有明确的if / else就可以完成,就像这样

for ($i=1; $i<=100; $i++){
  echo ($i%15?$i%5?$i%3?$i:"World":"Hello":"HelloWorld")."\n";
}

但我在这里有一些评论:

  • 我说“显式”因为三元操作是伪装的if / else
  • 你可能会同意我的可读性有点不足
  • 这段代码应该被认为是一种简洁的练习,如果你在生产环境中产生这样一条线,那么你应该期待你的同事们有很多应得的仇恨

:)