2009年6月15日 星期一

知識+ 小程式 -- 這樣的數有幾個?

題目是: 這樣的數有幾個?

說明:若有一個小於100000的整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請利用程式求出符合這個條件的數有幾個,並將之輸出。

//===============================================================
// 這題在 知識 + 出現了好幾次...
// http://tw.knowledge.yahoo.com/question/question?qid=1609061408255
// http://tw.knowledge.yahoo.com/question/question?qid=1009060305235
// http://tw.knowledge.yahoo.com/question/question?qid=1009061311160
// http://tw.knowledge.yahoo.com/question/question?qid=1509052404945
//===============================================================

這題很簡單, 但是有兩個陷阱...
1) 小於100000的整數 <=== 並非只限定正整數
2) 再加上168又是一個完全平方數 <=== 是加上100後再加168

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
double d;
int i, count=0;

printf("在小於100000的整數中,有 ");
for (i=-100; i<100000; i++)
if ((d=sqrt(i+100.), d==(int)d) && (d=sqrt(i+268.), d==(int)d) && ++count )
printf("%d, ", i);
printf("等共有 %d 個整數符合此條件。\n", count);

return 0;
}


.

倘若程式要求先印出所得數量, 再印出符合條件的整數時, 可用陣列先存放, 問題是要宣告或配置多大的陣列來存放呢? 一是先宣告至少為安全數量(需不小)的陣列. 二是運算兩次, 第一次運算取得總數量後再配置陣列大小來供第二次運算存放. 除此之外呢? 可使用遞迴...
.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int count=0;

int check(int num)
{
int i;
double d;
for(i=num-1; i>=-100; i--)
if ((d=sqrt(i+100.), d==(int)d) && (d=sqrt(i+268.), d==(int)d) ) break;
if (i<-100)
printf("在小於100000的整數中,共有 %d 個整數符合此條件;分別是: ", count);
else printf("%d%c ", check(i), (count++)? ',': ' ' );
return num;
}

int main()
{
check( 100000);
return 0;
}

沒有留言:

張貼留言