http://poj.org/problem?id=1006
总结一下:
首先:文件的输入输出需要练习;C语言的功底要加强;
其次:关于break的用法很神奇,值得探索,跳出当前的循环,注意是当前的;
最后:即使你AC了一道题目以后,还需要去优化;以提高自己的能力;
最后一种方法很巧妙;是值得思考的;娶个名字吧:就叫做:"抛光指路法“吧;
方法一:(文件)
//poj1006
#include "stdio.h"
#include<fstream>
using namespace std;
ifstream f("a1.txt");
int main()
{
int p,e,i,d,count=1,k;
while(f>>p>>e>>i>>d)//scanf("%d%d%d%d",&p,&e,&i,&d)&&p+i+e+d!=-4)
{
if(p==e==i==d==-1) {break;}
else
{
for(k=d+1;k<=21252+d;k++)
if((k-p)%23==0&&(k-e)%28==0&&(k-i)%33==0)
printf("Case %d: the next triple peak occurs in %d days.\n",count,k-d);
count++;
}
}
return (0);
}
方法二:(标准)
#include "stdio.h"
int main()
{
int p,e,i,d,count=1,k;
while(scanf("%d%d%d%d",&p,&e,&i,&d)&&p+i+e+d!=-4)
{
for(k=d+1;k<=21252+d;k++)
if((k-p)%23==0&&(k-e)%28==0&&(k-i)%33==0)
printf("Case %d: the next triple peak occurs in %d days.\n",count,k-d);
count++;
}
return (0);
}
方法三:(标准)——优化
#include<stdio.h>
int main()
{
int p,e,i,d,cas=1,k;
while(scanf("%d%d%d%d",&p,&e,&i,&d),p+e+i+d!=-4)
{
for(k=i%33; ;k+=33)
{
if((k-p)%23==0 && (k-e)%28==0 && k>d)
break;
}
printf("Case %d: the next triple peak occurs in %d days.\n",cas++,k-d);
}
return 0;
}
方法四:(标准)——最优化
可以做的进一步改进是从d+1开始逐一枚举寻找满足条件2)的数字a,
从a开始每步加23寻找满足条件2)3)的数字b,
从b开始每步加23*28寻找满足条件2)3)4)的数字x。
x就是我们要找的数字,输出时输出x-d。
#include <stdio.h>
int main()
{
int p,e,i,d,k,count=0;
scanf("%d%d%d%d",&p,&e,&i,&d);
while(p!=-1&&e!=-1&&i!=-1&&d!=-1)
{
for(k=d+1;k<21252+d;k++) if((k-p)%23==0) break;
for(;k<21252+d;k+=23) if((k-e)%28==0) break;
for(;k<21252+d;k+=23*28) if((k-i)%33==0) break;
printf("Case %d:the next triple peak occurs in %d days.\n",count,k-d);
scanf("%d%d%d%d",&p,&e,&i,&d);
count++;
}
return (0);
}