杭电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; }