OJ problem(Tick and Tick) 1006

时间:2021-12-01 12:38:32

杭电OJ系统上面的Problem1006,网址:点击打开链接

 

思路:(非原创的)秒针的速度s=6。/s,分针是1/10。/s,时针是1/120。/s

所以相对速度为s-m=59/10。/s,s-h=719/120。/s,m-h=11/120。/s

那么相差一度所需的时间为sm=10/59s/。,sh=120/719s/。,mh=120/11s/。

所以相差360的周期为tsm=360*sm,tsh=360*sh,tmh=360*mh;

设相差的角度为n,

所以必须同时满足:n*sm+k1*tsm<t<tsm-n*sm+k1*tsm

        n*sh+k2*tsh<t<tsh-n*sh+k2*tsh

                                 n*mh+k1*tmh<t<tmh-n*mh+k1*tmh


问题:(原创)1.为什么要在每个数后面加一个点,有什么用处呢?  去掉点之后就发现不能输出数据了!

                         2.第三个for循环中为什么有个t,去掉t之后,发现输出的结果不正确了!


收获:提高自己把数学表达式转化为代码的能力! 对于iomanip类库要充分了解,掌握setw(),setfill(),setiosflags(ios::fixed),setprecision(),的用法!

           用法:

▲setw(n)用法: 通俗地讲就是预设宽度
如 cout<<setw(5)<<255<<endl;
结果是:
(空格)(空格)255
▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充
如 cout<<setfill(‘@‘)<<setw(5)<<255<<endl;
结果是:
@@255
应当指出,setfill和setw只作用于紧随其后的部分,例如
cout<<setfill('*')<<setw(6)<<123<<456;的运行结果为***123456,这里set('*')<<setw(6)只对 123 起作用输出了***123,456作为另一部分随后输出。
▲setbase(int n) : 将数字转换为 n 进制.
如 cout<<setbase(8)<<setw(5)<<255<<endl;
cout<<setbase(10)<<setw(5)<<255<<endl;
cout<<setbase(16)<<setw(5)<<255<<endl;
结果是:
(空格)(空格)377
(空格)(空格) 255
(空格)(空格)(空格) f f
▲ setprecision用法
使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。
如果与setiosflags(ios::scientific)合用, 可以控制指数表示法的小数位数。setiosflags(ios::scientific)是用指数方式表示实数。
setiosflags(ios::fixed) 固定的浮点显示
setiosflags(ios::scientific) 指数表示
setiosflags(ios::left)  左对齐
setiosflags(ios::right)  右对齐
setiosflags(ios::skipws) 忽略前导空白
setiosflags(ios::uppercase) 16进制数大写输出
setiosflags(ios::lowercase) 16进制小写输出
setiosflags(ios::showpoint) 强制显示小数点
setiosflags(ios::showpos) 强制显示符号

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    int t;
    double n,sum,ft1,ft2,ft3,et1,et2,et3,max,min;
    double sm,sh,mh,tsm,tsh,tmh,fsm,fsh,fmh,esm,esh,emh;
    sm=10./59.;//为什么要加上一个点?
    sh=120./719.;
    mh=120./11.;
    tsm=360*sm;
    tsh=360*sh;
    tmh=360*mh;
    while(cin>>n)
    {
        if(n<0)
            break;
        sum=0;
        fsm=sm*n;
        fsh=sh*n;
        fmh=mh*n;
        esm=tsm-fsm;
        esh=tsh-fsh;
        emh=tmh-fmh;
        for(ft3=fmh,et3=emh;et3<=43200;et3+=tmh,ft3+=tmh)
        {
            for(ft2=fsh,et2=esh;et2<=43200;et2+=tsh,ft2+=tsh)
            {
                if(et2<=ft3)
                    continue;
                if(ft2>=et3)
                    break;
                for(t=0,ft1=fsm,et1=esm;et1<=43200;t++,et1=esm+t*tsm,ft1=fsm+t*tsm)//为什么加个t?
                {
                    if(et1<=ft3 || et1<=ft2)
                        continue;
                    if(ft1>=et3 || ft1>=et2)
                        break;
                    max=ft1;
                    if(ft2>max)
                        max=ft2;
                    if(ft3>max)
                        max=ft3;
                    min=et1;
                    if(et2<min)
                        min=et2;
                    if(et3<min)
                        min=et3;
                    sum+=min-max;
                }
            }
        }
        sum/=432.;
		cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl;
    }
	return 0;
}