• 3

想請教大家程式設計問題(有寫出一些code)

姜哥 wrote:
喔!老師有說對面不算...(恕刪)


對面不算可能這個code要再改改拉

我也跑出4 360
應該是正確的(不考慮對面的話)
冏...電腦累格重複發文

自刪

151515151515

囧銨 wrote:
對面不算可能這個code要再改改拉

我也跑出4 360
應該是正確的(不考慮對面的話)


耶~謝謝這位大大~

雖然是C++但是至少讓我對答案有信心了

謝謝~
其實這題目不難作

只要求出 SA ,sB ,SC 兩兩相減 <=1 即可 ,

所以,重點就在圓週上,也就是要在 360 度繞幾圈

用迴圈計算,Sa , sb , sc 各加一,只要大於 360 度時(就是一年),

把多的取下來,接下來繼續加,

我用DELPHI 來表示好了

2920 就是天 ,SA 星 4年,又360 天

這題目要考的是迴圈的控制~~

--Code---

//定義初始值 各角度
sa_deg := 0;
sb_deg := 7;
sc_deg := 15;


//總天數 歸零
Sa_Day_count :=0;
Sb_Day_count :=0;
Sc_Day_count :=0;


Runflag := True;

while Runflag do
begin


//計算角度
sa_deg :=sa_deg + Star_sa_day_deg ; // sa_deg :=sa_deg + 0.5625 ;
sb_deg :=sb_deg + Star_sb_day_deg ; //用常數取代
sc_deg :=sc_deg + Star_sc_day_deg ;


//符合條件,三個相減小於一就離開迴圈
if (Abs(sa_deg - sb_deg) <= 1) and
(Abs(sb_deg - sc_deg) <= 1) and
(Abs(sc_deg - sa_deg) <= 1) then Runflag := False;


//大於 360 度,要扣除,剩下的餘數要留著,跟 地球年一樣, 365.25 = 1 year

If sa_deg >360 then
begin
sa_deg := sa_deg - 360;

end;

If sb_deg >360 then
begin
sb_deg := sb_deg - 360;

end;

If sc_deg >360 then
begin
sc_deg := sc_deg - 360;
end ;

// sa , sb, sc 總天數
INC(Sa_Day_count);
INC(Sb_Day_count);
INC(Sc_Day_count);



end;

姜哥 wrote:
#include <stdio.h>
#include <math.h>
int main()

{
int d,y;
double sa_deg,sb_deg,sc_deg;
sa_deg=0; sb_deg=7; sc_deg=15;
d=0; y=0;
sa_deg=sa_deg+0.5625;

sb_deg=sb_deg+1.3;

sc_deg=sc_deg+2.53;



while(1)
{
d=d+1;
y=d/640;

if (fabs(sa_deg-sb_deg)<1&&fabs(sa_deg-sc_deg)<1&&fabs(sb_deg-sc_deg)<1)
{
printf("Y=%d and D=%d are the answer!\n",y,d);

}


if (sa_deg > 360, sb_deg > 360, sc_deg > 360)

sa_deg=sa_deg-360.0;

sb_deg=sb_deg-360.0;

sc_deg=sc_deg-360.0;




printf("Y=%d and D=%d are the answer!\n",y,d);



}
}



幾個小地方要注意一下...
你的 d & y 最好是用進位的 不要讓 d 無限大下去...題目數字換了遲早會爆掉...

第二是下面360判斷的地方... 看起來你是想寫成
if (sa_deg > 360, sb_deg > 360, sc_deg > 360)
{
sa_deg=sa_deg-360.0;
sb_deg=sb_deg-360.0;
sc_deg=sc_deg-360.0;
}

這樣是任一顆行星只要轉一圈 其他行星一起回起點....
又不是賽跑 有人抵達終點就比下一場=_= 這樣你的上面的 0,7,15的初始值根本沒用...
而且每次都歸0重跑 當然是無窮回圈

不過你寫成
if (sa_deg > 360, sb_deg > 360, sc_deg > 360)
sa_deg=sa_deg-360.0;
sb_deg=sb_deg-360.0;
sc_deg=sc_deg-360.0;

這樣實際上會變成
if (sa_deg > 360, sb_deg > 360, sc_deg > 360)
{
sa_deg=sa_deg-360.0;
}
sb_deg=sb_deg-360.0;
sc_deg=sc_deg-360.0;
所以每次loop就清掉 b c 的角度 所以依然是在裡面轉圈圈轉到死




....看不懂的地方麻煩先google跟翻翻課本吧 XD

typedef struct __PLANET
{
double dDegree;
double dIncrease;
long lDay;
long lYear;
}PLANET;

#define rounded(_x_)\
_x_.dDegree+=_x_.dIncrease;\
_x_.lDay++;\
if (_x_.dDegree >=360)\
{\
_x_.lDay=0;\
_x_.dDegree -=360;\
_x_.lYear++;\
}\

PLANET sa={0.0f,0.5625f,0,0};
PLANET sb={7.0f,1.30f,0,0};
PLANET sc={15.0f,2.530f,0,0};

while (1)
{
double diff1 = fabs(sa.dDegree - sb.dDegree);
double diff2 = fabs(sa.dDegree - sc.dDegree);
double diff3 = fabs(sb.dDegree - sc.dDegree);
if (diff1<=1 && diff2 <=1 && diff3<=1)
break;
rounded(sa);
rounded(sb);
rounded(sc);
}
printf("a : %d Year ,%d Day\n",sa.lYear,sa.lDay);
printf("b : %d Year ,%d Day\n",sb.lYear,sb.lDay);
printf("c : %d Year ,%d Day\n",sc.lYear,sc.lDay);

上面的code run出來是 4年360天
你的寫法會有問題可能要改成這樣

#include <stdio.h>
#include <math.h>
int main()

{
int d,y;
///
int dayperyear=640;
////
double sa_deg,sb_deg,sc_deg;
sa_deg=0; sb_deg=7; sc_deg=15;
d=0; y=0;

///
double deltaab;
double deltabc;
double daltaca;
//





while(1)
{
sa_deg=sa_deg+0.5625;

sb_deg=sb_deg+1.3;

sc_deg=sc_deg+2.53;

d=d+1;
if(d==dayperyear)
{
y++;
d=0;
}
deltaab = fabs(sa_deg-sb_deg)%360;
deltabc = fabs(sb_deg-sc_deg)%360;
deltaca = fabs(sc_deg-sa_deg)%360;

if (deltaab <1 && deltabc <1 && deltaca <1)
{
printf("Y=%d and D=%d are the answer!\n",y,d);
break;
}




}
}
湊個熱鬧XD...

跑出來也是4年360天 不過不知到對不對。
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;

int main(){

double a=0,b=7.0,c=15.0;
int d=0;

do{
d++;
a+=0.5625;
b+=1.3;
c+=2.53;

if(a >=360) a-=360;
if(b >=360) b-=360;
if(c >=360) c-=360;

}while(fabs(a-b) > 1 || fabs(b-c) >1 || fabs(a-c) >1) ;

cout << d << endl;
cout << d/640 <<" years and " << d%640 << " days." << endl;
cout << "a=" << a <<":b=" << b <<":c="<<c<<endl;

}
小弟粗淺的解法如下:
總天數為4年又360天

#include <stdio.h>

void main()
{
float sa;
float sb;
float sc;
sa = 0;
sb = 7;
sc = 15;

int countDay;
countDay =0;
while(1)
{
if(abs(sa - sb) < 1){
if(abs(sa - sc) < 1){
if(abs(sb - sc) < 1){
break;
}
}
}

sa = sa + 0.5625;
sb = sb + 1.3;
sc = sc + 2.53;

if (sa >= 360){
sa = sa - 360;
}

if (sb >= 360){
sb = sb - 360;
}

if (sc >= 360){
sc = sc - 360;
}
countDay = countDay + 1;
}

int countYear;
countYear = 0;
if(countDay >= 640){
countYear = (int)(countDay / 640);
countDay = countDay % 640;
}
printf("Total is: %d years and %d days",countYear,countDay);
}
看了版主的題目有點興趣,也試著寫了一個

答案跟大家一樣,但不知道是否有BUG,參考參考囉~~


#include <cstdlib>
#include <iostream>
#include <math.h>

int main()
{

float sa_deg=0;
float sb_deg=7;
float sc_deg=15;
float sa_deg_tmp=0;
float sb_deg_tmp=0;
float sc_deg_tmp=0;
int all_day=0;
int yyy=0;
while(1)
{
sa_deg_tmp=all_day*0.5625+sa_deg;
sb_deg_tmp=all_day*1.3 +sb_deg;
sc_deg_tmp=all_day*2.53 +sc_deg;

sa_deg_tmp=sa_deg_tmp-(floor(sa_deg_tmp/360.0))*360;
sb_deg_tmp=sb_deg_tmp-(floor(sb_deg_tmp/360.0))*360;
sc_deg_tmp=sc_deg_tmp-(floor(sc_deg_tmp/360.0))*360;


if((fabs(sa_deg_tmp-sb_deg_tmp)<1) &&
(fabs(sb_deg_tmp-sc_deg_tmp)<1) &&
(fabs(sa_deg_tmp-sc_deg_tmp)<1)
)
{
break;
}
else
{
all_day++;
}
}
printf("year=%d, day=%d",(all_day/640),all_day%640);
system("PAUSE");
return EXIT_SUCCESS;
}
我也寫一個

void ThreeInALine()
{
static double diffDeg = 1.0;
static int aYearDayCnt = 640;

double aDeg = 0.0;
double bDeg = 7.0;
double cDeg = 15.0;
int aYearCnt = 0;
int aDayCnt = 0;

while ((fabs(aDeg - bDeg) >= diffDeg) ||
(fabs(bDeg - cDeg) >= diffDeg) ||
(fabs(cDeg - aDeg) >= diffDeg))
{
aDayCnt++;
if (aDayCnt >= aYearDayCnt)
{
aDayCnt = 0;
aYearCnt++;
}

aDeg += 0.5625;
if (aDeg >= 360.0)
aDeg -= 360.0;

bDeg += 1.3;
if (bDeg >= 360.0)
bDeg -= 360.0;

cDeg += 2.53;
if (cDeg >= 360.0)
cDeg -= 360.0;
}

printf("A %d years and %d days passed\n", aYearCnt, aDayCnt);
printf("A-degree=%g, B-degree=%g, C-degree=%g\n", aDeg, bDeg, cDeg);
}

如果把其中的 dtffDeg 改成 0.5, 就會進入無窮迴圈
  • 3
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?