• 12

[有趣]越簡單的程式, 越多人不會寫??

剛剛看到一個網頁:
http://www.codinghorror.com/blog/archives/000781.html

"FizzBuzz Questions"

Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".

Most good programmers should be able to write out on paper a program which does this in a under a couple of minutes. Want to know something scary? The majority of comp sci graduates can't. I’ve also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.

講中文的話就是:

印出 1 到 100,但如果是 3 的倍數就印 Fizz,如果是 5 的倍數就印 Buzz,如果同時是 3 和 5 的倍數就印 FizzBuzz。

購簡單吧? 但據上面那篇文章的作者 200個programmer中有199個寫不出來, 或寫錯..

挑戰一下吧..(拜託別用google找答案)
2007-10-05 12:10 發佈
文章關鍵字 程式
英文內容是說要寫在紙上耶,不是直接在電腦上 coding~

就我所認知,在這樣的情形下,這個比例一點都不誇張。
確實很少人能夠直接用筆在紙上寫下輸入後就能跑的程式~
會寫錯應該是被規格順序騙了,
先判斷是不是(5和3)15的倍數,再去判斷5或3吧....
金面- 戰文起手式--- 純屬個人觀點, 勿筆戰.
不需要吧
就直接 數字+是否為3的倍數+是否為5的倍數
同時是的話自然會接在一起

多加了3和5倍數的判斷式
應該就是那199人的錯誤
for(int i=1;i<=100;i++)
{
if(i % 3 ==0 && i % 5==0)
printf("\n FizzBuzz");
else if(i % 3 ==0)
printf("\n Fizz");
else if(i % 5 ==0)
printf("\n Buzz");
else
printf("\n %d",i);
}

應該是這樣吧?
不過,答錯的人的確大部分是把if(i % 3 ==0) 擺第一行了....

小弟只會4bits MCU,所以畫了其中一種解決方法的流程圖,好心的大大幫我看看有沒有錯!!



--------自首-----------------------
我真的錯了耶,我忘了加上印出1到100.
這讓我想到... 會不會是 iq 題...
就這一條程式來說

printf("\n 1");
printf("\n 2");
printf("\n Fizz");
printf("\n 4");
printf("\n Buzz");
:
:
:

這樣子寫答對的機會應該高一點
不過幸好是100.... 1000的話就 Orz

sorry, 我不是程式員 :p
有意思!先寫寫,還沒驗證,吃飽飯再來驗證。

for(
    LoopCount0=1;
    LoopCount0<=100;
    LoopCount0++
)    {
    if((LoopCount0%3)==0)   {
        if((LoopCount0%5)==0)   {
            Print("FizzBuzz...");
        }else  {
            Print("Fizz...");
        }
    }else  if((LoopCount0%5)==0)   {
        Print("Buzz...");
    }else  {
        Print(LoopCount0);
    }
}
不知道要簽什麼的說‧‧‧
for(int i=1;i<=100;i++)
{
  if(i % 3 == 0)
    printf("Fizz");
  if(i % 5 == 0)
    printf("Buzz");
  if(i % 15 != 0)
    printf("%d", i);
  printf("\n");
}
請大家推廣中醫. 中醫才是王道啊.
用C驗證一下:


#include<stdio.h>

void  main(void)   {
    int   LoopCount0;

    for(
        LoopCount0=1;
        LoopCount0<=100;
        LoopCount0++
    )    {
        if(LoopCount0%3==0)   {
            if(LoopCount0%5==0)   {
                printf("FizzBuzz...");
            }else  {
                printf("Fizz...");
            }
        }else  if(LoopCount0%5==0)   {
            printf("Buzz...");
        }else  {
            printf(
                "%d...",
                LoopCount0
            );
        }
    }

    printf("\n");
}


如果不看for本身的條件判斷,這個方式的條件判斷深度最大(固定)是兩層。好像是極限了,沒辦法再縮減到只有一層。

修正,上一段話應該說:如果不看for本身的條件判斷,這個方式要得到最後結果,worst-case會經歷過兩次判斷式,以及兩次除法取餘運算。好像是極限了,沒辦法再縮減到只有一次。

少一點條件判斷,程式碼少花工夫達成相同結果,提升效能。而且現代的CPU都有pipe line,條件判斷失敗會導致pipe line清空重填,多浪費一些時間。 條件判斷越少,越不容易發生這種時間浪費。

執行結果:

1...2...Fizz...4...Buzz...Fizz...7...8...Fizz...Buzz...11...Fizz...13...14...Fiz
zBuzz...16...17...Fizz...19...Buzz...Fizz...22...23...Fizz...Buzz...26...Fizz...
28...29...FizzBuzz...31...32...Fizz...34...Buzz...Fizz...37...38...Fizz...Buzz..
.41...Fizz...43...44...FizzBuzz...46...47...Fizz...49...Buzz...Fizz...52...53...
Fizz...Buzz...56...Fizz...58...59...FizzBuzz...61...62...Fizz...64...Buzz...Fizz
...67...68...Fizz...Buzz...71...Fizz...73...74...FizzBuzz...76...77...Fizz...79.
..Buzz...Fizz...82...83...Fizz...Buzz...86...Fizz...88...89...FizzBuzz...91...92
...Fizz...94...Buzz...Fizz...97...98...Fizz...Buzz...
  • 12
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 12)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?