30天编程练习(八)

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;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值