• 12

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

讓我想到前兩天在跟以前同事聊, 他說他從別人身上學到的面試的技巧是,
考一題程式:
第一行印一個星號, 第二行印兩個, 第三行印三個, 依此類推, 印出N行來.
當然不能直接用N行printf()印出來...

不好意思, 很多人寫不出來(聽說也遇過抬青椒的寫不出來的)....那, 給點提
示好了, 知道for是什麼吧..... 如果寫出來了, 再下一題, 印到第N行的時候
星號要遞減縮回去到1為止, 限制是只能用一個迴圈處理. 又打死一堆人....

據稱允收條件是, 經過提示有把第一題寫出來的就還算合格.......
與失敗為伍者,天天靠盃都是別人的錯。 與成功為伍者,天天跟失敗切磋直到不再出錯。
for(int i=1;i<=100;i++)
{
  printf("\n");
  if(i % 3 == 0 || i % 5 == 0){
    if(i % 3 == 0)
      printf("Fizz");
    if(i % 5 == 0)
      printf("Buzz");
  } else{
    printf("%d",i);
  }
}
bluesystem wrote:
讓我想到前兩天在跟以前同事聊, 他說他從別人身上學到的面試的技巧是,......(恕刪)

奇怪,面試時我考過這一題耶,結果沒人寫得出來。該不會你同學的「別人」就是我吧?

前幾天是改考費氏級數,也是用一級迴圈就可以完成的小程式。簡直是C初學者的家庭作業,也是寫不出來。

我也沒要求要用啥進階技巧,只要寫得出來就可以了。甚至我還說,畫流程圖也可以。再不行,用中文寫出流程描述(中文的pseudo code)也可以。

本來還想考遞迴的,看來還是不要出那麼難的好了‧‧‧

我改拿這題來考看看好了,看有沒有人寫得出來。
星號寫不出來的表示資料結構都在混哦~
請大家推廣中醫. 中醫才是王道啊.
寫星號用迴圈就可以了啦,我可不敢考到啥資料結構的,怕面試時間拉太長。
星號迴圈的相關題目, 我記得我在唸高職修basic時就寫過不少, 如三角, 正三角, 菱形....等等,
那時還沒唸過什麼資料結構咧, 應該稍微想一下就可以寫出來吧.

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

像這樣算一層嗎?

#include <stdio.h>

int main() {
int i;
int j;
for (i=1;i<101;i++) {
j = 0;
if (i % 3 == 0) {
j++;
printf("Fizz");
}
if (i % 5 == 0) {
j++;
printf("Buzz");
}
if (j)
printf("\n");
else
printf("%d\n",i);
}
return 0;
}
bluesystem wrote:
讓我想到前兩天在跟以...(恕刪)


int input;
int loop1 = 0;
int loop2 = 0;

cout << "N = ";
cin >> input;
if( input > 0 )
{
 do
 {
  cout << "*";
  if( ++loop2 > loop1 )
  {
  ++loop1;
  loop2 = 0;
  cout << endl;
  }
 }
 while( loop1 < input );
}
笨 wrote:
>>如果...(恕刪)


也許我用「層」來描述不是很好,應該用次數會比較恰當一些。

看起來只有一層,可是你卻連續判斷了三次,結果還是需要判斷三次。我來說給你聽。

if (i % 3 == 0)是第一次,if (i % 5 == 0)是第二次,if (j)是第三次。換句話說,不管數字是多少,你一定要判斷三次,其中可能只有一次會成立,其他兩次都是浪費時間而已。

邏輯判斷本來就會有成立或不成立兩個結果,不成功的那一次就是多餘的消費了。前面提過,不成立的判斷有可能會發生流程轉移,導致pipe line清掉重填,所以CPU會多浪費一些時間。

因此,用比較巧妙的方法,讓不成立的次數越少越好。當迴圈的次數多了,這個斤斤計較的次數,就會是效能的差異了。

第一行印一個星號, 第二行印兩個, 第三行印三個, 依此類推, 印出N行來.
當然不能直接用N行printf()印出來...


忘記 C language 了
用pseudo language 來寫的話

set n = some number.
for i = 1 to n do
{
for j = 1 to i do
{
print "*"
}
print 換行
}


再下一題, 印到第N行的時候
星號要遞減縮回去到1為止, 限制是只能用一個迴圈處理. 又打死一堆人....


這個比較困難
我想到的方法是用 recursion


set function printstars (var i,n: integer, str:string)
{
if i < n then
{
print str;
call function printerstars (i+1, n, str+"*")
print str;
}
else
print str;
}

主成式
set n = some numbers (must > 0)
call printstars (1, n, "*");


不知道這樣對不對?
http://www.mike-chen.net http://www.flickr.com/photos/totaleclipse
  • 12
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 12)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?