1032 函数题
题意:1。输入n
2。打印n
3。如果n=1,则停止
4。如果n是奇数,则n = 3n + 1
5。否则n=n/2
6。跳转到2
一个数字完成一次所需次数为一个周期,输入i,j,求i到j区间所有数字上的最大周期长度。
解析:根据题意编写循环体即可,要注意的是输入的i不一定小于j。
#include<stdio.h>
int main()
{
int i,t,max,m,n,k,a,b;
while(scanf("%d%d",&m,&n)!=EOF)
{
a=m,b=n;
if(m>n)
{
t=m;
m=n;
n=t;
}
for(i=m,max=0;i<=n;i++)
{
t=i;
k=0;
while(t!=1)
{
k++;
if(t%2==1)
t=t*3+1;
else
t/=2;
}
if(max<k)
max=k;
}
printf("%d %d %d\n",a,b,max+1);
}
return 0;
}
1034 分享糖果
题意:许多学生坐在一个面向老师的圈子里,每个学生最初都有偶数块糖。当老师吹口哨时,每个学生同时把一半的糖果送给右边的同学。任何学生,如果分享之后有奇数块糖,老师再给他一块。游戏结束直到所有学生都有同样数量的糖果。
解析:每次分配后都将所有人的糖果数量排序,当最大值和最小值相等,则所有人的糖果数量相等。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000100
using namespace std;
long long a[N],b[N];
int main()
{
long long m,n,i,j,cot,t,p;
while(scanf("%lld",&m),m)
{
cot=0;
for(i=1;i<=m;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i];
}
sort(b+1,b+m+1)
while(b[1]!=b[m])
{
t=a[m];
for(i=1;i<=m;i++)
{
p=t/2+a[i]/2;
t=a[i];
a[i]=p;
if(a[i]&1)
a[i]++;
b[i]=a[i];
}
sort(b+1,b+m+1);
cot++;
}
printf("%lld %lld\n",cot,a[1]);
}
return 0;
}
1035 机器人走迷宫
题意:判断一个机器人能否走出迷宫,并给出离开迷宫的步数或者在迷宫内的循环步数
解析:用一个矩阵纪录机器人的路径,如果走到标记过的路径上,就循环了,若是走到边界,则离开迷宫。
#include <iostream>
using namespace std;int main()
{
int i,j,n,k,a,b,s,m;
bool flag;
char x[11][11];
while (cin>>i>>j>>n && (i!=0||j!=0))
{
s=0;flag=false;
for (k = 0; k < i; k++)
{
cin>>x[k];
}
a=0;b=n-1;
while (a>=0&&b>=0&&a<i&&b<j)
{
switch (x[a][b])
{
case 'N':x[a][b]=s++;a--;break;
case 'S':x[a][b]=s++;a++;break;
case 'E':x[a][b]=s++;b++;break;
case 'W':x[a][b]=s++;b--;break;
default:
s=s-x[a][b];flag=true;m=x[a][b];
break;
}
if(flag) break;
}
if (flag)
{
cout<<m<<" step(s) before a loop of "<<s<<" step(s)"<<endl;
}
else
{
cout<<s<<" step(s) to exit"<<endl;
}
}
return 0;
}