1. 程式人生 > >C語言/C++程式設計題 之 時鐘(分針追趕時針,分針與時針相遇次數問題)

C語言/C++程式設計題 之 時鐘(分針追趕時針,分針與時針相遇次數問題)

題目描述

有一個標準的12小時時鐘,它有一個時針,一個分針。現問你,在給定的兩個時刻之間分針與時針相遇幾次?


輸入

輸入包含多組測試資料。每組輸入包含4個整數,前兩個數字分別表示起始時刻的小時和分,後兩個數字分別表示結束時刻的小時和分。
小時數在[1,12]內,分鐘數在[0,59]內。
注意:
1)輸入中的起始和結束時刻均不會出現時針和分針恰好相遇的情況,例如12點0分。
2)輸入中不會出現起始時刻和結束時刻相同的情況。
3)在時針從起始時刻到結束時刻運轉的過程中,時針轉過的角度一定小於360度。
4)在時針從起始時刻到結束時刻運轉的過程中,時針有可能越過錶盤上12點鐘的刻度。如果越過了,說明起始時刻和結束時刻中一個是A.M.,一個是P.M.。如果沒越過,說明起始時刻和結束時刻都是A.M.或都是P.M.。


輸出

輸出的第一行為“Initial time  Final time  Passes”,具體的輸出格式請參照輸出樣例。可用滑鼠選中來看出空格數等細節。

樣例輸入

12 50  1  2
 3  8  3 20
 2 45 11  0
11  0  3 20
 1  2 12 50
 3 20  3  8



樣例輸出
Initial time  Final time  Passes
       12:50       01:02       0
       03:08       03:20       1
       02:45       11:00       8
       11:00       03:20       4
       01:02       12:50      11
       03:20       03:08      10



分析:每過一分鐘,時針轉0.5度,分針轉6度

    考查程式碼能力!!!

AC程式碼如下:

#include "stdio.h"

int main(int argc, char* argv[])
{
	int m1,n1,m2,n2;
	int m11;//相當與m1的別名,輔助運算
	int i;
	int count;//記錄時針分鐘相遇的次數
	double s1,s2,t1,t2;//記錄時針分針的即時度數
	double m0,n0;//以0刻度位置為0度,時針和分針的初始度數
	int flag=0;
	while(scanf("%d%d%d%d",&m1,&n1,&m2,&n2)!=EOF)
	{
		if (!flag)//固定輸出第一行,且只有一次
		{
			printf("Initial time  Final time  Passes\n");
		}
		flag++;
		printf("       ");//按要求的格式輸出
		if (m1<10)
		{
			printf("0");
		}
		printf("%d",m1);
		printf(":");
		if (n1<10)
		{
			printf("0");
		}
		printf("%d",n1);
		printf("       ");
		if (m2<10)
		{
			printf("0");
		}
		printf("%d",m2);
		printf(":");
		if (n2<10)
		{
			printf("0");
		}
		printf("%d",n2);
		printf("      ");//
		s1=t1=s2=t2=0;//初始化各變數
		count=0;
		if (m1>=12)
		{
			m11=m1-12;
		}
		else
		{
			m11=m1;
		}
		m0=30*m11+n1*0.5;//時針初始度數
		n0=6*n1;		 //分針初始度數
		if (m1>m2||(m1==m2&&n1>=n2))//判斷是否時針是否越過錶盤上12點鐘的刻度
		{
			m2+=12;
		}
		if (n1<=n2)//s1表示從起始時刻到結束時刻分鐘數
		{
			s1+=((m2-m1)*60+(n2-n1));
		}
		else
		{
			s1+=((m2-m1-1)*60+(60+n2-n1));
		}
		t1=m0;
		t2=n0;
		if (m0>=n0&&(m0+s1*0.5<=n0+s1*6))//判斷分針在360度之內,是否追到時針
		{
			count++;
		}
		for (i=n0;i-n0<=s1;i++)//走遍所有的時間(分鐘數)
		{
			t1+=0.5;//t1,t2表示時針和分針當前的度數
			t2+=6;
			if (t2-t1>=360)//分針在超過360度追到時針的條件
			{
				count++;
				t2-=360;
			}
		}
		if (count<10)
		{
			printf(" ");
		}
		printf("%d\n",count);
	}
	return 0;
}