優(yōu)惠券推廣網(wǎng)站怎么做seo怎么搞
問題分析
這個問題的關(guān)鍵有兩點:1.怎么計算時針,分針,秒針之間的夾角,2.時針,分針,秒針都是勻速運動的,并非跳躍性的。問題1很好解決看下面的代碼就能明白,我們先考慮問題2,有的同學可能會想這個答案存在很多,比如6:15,此時時針指向6,分針指向3,秒針指向0,滿足A=2B,但其實是不存在這種情況的,因為此時分針指向3,時針必定不可能指向6,而是在6的左邊,要記住時鐘是漸變的而非躍變的。明白這個就好寫了。
寫法一
題目告訴我們時針最大值為6,分針最大值60,秒針最大值60,因此可能存在答案的時間范圍為1~25199秒(0:0:0這個答案被剔除了),我們以秒為單位來開始遍歷。秒針每秒走6度,分鐘每10秒走1度,時針每120秒走1度。
#include <bits/stdc++.h>
using namespace std;
int main() {int s,f,m;double ds,df,dm,A,B;for(int i=1;i<=25199;i++){dm=i*6.0;//秒鐘轉(zhuǎn)過的角度df=i*0.1;//分鐘轉(zhuǎn)過的角度ds=i*1.0/120;//時鐘轉(zhuǎn)過的角度while(dm>=360)dm-=360;//求余while(df>=360)df-=360;//求余A=min(fabs(ds-df),360-fabs(ds-df));//夾角必為正值所以取絕對值,但是要在0~180之間,因此要取它與它的補角中較小的。B=min(fabs(dm-df),360-fabs(dm-df));if(fabs(A-2*B)<1e-3){//因為是浮點運算要考慮精度損失cout<<i/60/60<<" "<<i/60%60<<" "<<i%60<<endl;}}return 0;
}
方法二
三層循環(huán)遍歷時鐘,分鐘,秒鐘的每種情況。
#include<bits/stdc++.h>
using namespace std;int main()
{for(int s=0;s<=6;++s){//遍歷時鐘for(int f=0;f<60;++f){//遍歷分鐘for(int m=0;m<60;++m){//遍歷秒鐘if(s==0&&f==0&&m==0) continue;double dm=360*m/60;//秒針走過的角度double df=360*f/60+dm/60;//分針走過的角度,dm/60:加上秒鐘引起的分鐘變化double ds=360*s/12+df/12;//時針走過的角度//df/12:加上分鐘引起的時鐘變化double A=abs(df-ds),B=abs(df-dm);//取小的角度A=min(A,360-A);B=min(B,360-B);if(fabs(A-2*B)<=1e-10){printf("%d %d %d\n",s,f,m);}}}}return 0;
}