zoukankan      html  css  js  c++  java
  • [UVA100] The 3n + 1 problem.题解

    这道橙题也太水了吧!直接模拟输出流程就可以了!

    老规矩,先看题目。

    这题让我们寻找输入的每对(i,j)[i,j]内所有数字区间长度的max值。我们可以用模拟递推对[i,j]内所有的数进行相同的操作。
    操作流程如下:

    想必看了流程图,思路就更清晰了。但别忘了,我们求的是数n的周期长度即操作次数,所以我们在编写period函数时要加上计数器count。
    以下就是period函数的代码了:

    1 int period(int x){//period函数对数x进行操作
    2     int count=1;//计数器初始化为1,程序至少输出一次(原始)x
    3     while(x!=1){//如果x不为1,继续对x进行操作
    4         if(x%2) x=x*3+1;//x为奇数时,其值为3x+1
    5         else x/=2;//否则x为偶数时,其值为x/2
    6         count++;//每执行一次操作,操作次数+1
    7     }
    8     return count;//返回操作次数
    9 }

    写好函数代码以后,用for循环对每对[i,j]区间内的数执行period操作,再用maxn记录区间内操作数的最大值即可。

    那么以下就是AC代码!


    代码

    (注释版)

     1 #include<bits/stdc++.h>//万能头文件
     2 using namespace std;
     3 int i,j;
     4 int period(int x){//period函数对数x进行操作
     5     int count=1;//计数器初始化为1,程序至少输出一次(原始)x
     6     while(x!=1){//如果x不为1,继续对x进行操作
     7         if(x%2) x=x*3+1;//x为奇数时,其值为3x+1
     8         else x/=2;//否则x为偶数时,其值为x/2
     9         count++;//每执行一次操作,操作次数+1
    10     }
    11     return count;//返回操作次数
    12 }
    13 int main(){//好习惯,程序从主函数读起
    14     while(cin>>i>>j){//while不断读入i,j,直到程序结束
    15         int maxn=0;//求最大值要初始化为0
    16         for(int a=min(i,j);a<=max(i,j);a++)//a从i,j中较小的开始,遍历整个区间内所有整数
    17             maxn=max(maxn,period(a));//最大值为此次操作次数和之前操作次数中的最大值
    18         cout<<i<<" "<<j<<" "<<maxn<<endl;//输出时别忘了换行endl
    19     }
    20     return 0;//返回值为0
    21 }

    (无注释版)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int i,j;
     4 int period(int x){
     5     int count=1;
     6     while(x!=1){
     7         if(x%2) x=x*3+1;
     8         else x/=2;
     9         count++;
    10     }
    11     return count;
    12 }
    13 int main(){
    14     while(cin>>i>>j){
    15         int maxn=0;
    16         for(int a=min(i,j);a<=max(i,j);a++)
    17             maxn=max(maxn,period(a));
    18         cout<<i<<" "<<j<<" "<<maxn<<endl;
    19     }
    20     return 0;
    21 }

    总结

    1. while(cin>>i>>j): 读入每对(i,j)直至无可读取信息。
    2. 在比较最大值和最小值时,记录最大值、最小值的变量要初始化为最小数和最大数。
    3. 碰到一些无思路的操作流程题,建议先模拟递推寻找思路。

  • 相关阅读:
    江の島西浦写真館2-1
    江の島西浦写真館1-2
    Oracle 查询表空间使用情况
    Oracle 的开窗函数 rank,dense_rank,row_number
    oracle11G 用户密码180天修改概要文件过程
    CentOS6 安装 MySQL5.7
    linux下SS 网络命令详解
    CentOS6 网络设置
    redhat 6 红帽6 Linux 网络配置
    Oracle分析函数——函数列表
  • 原文地址:https://www.cnblogs.com/integricode26/p/UVA100-the-3n-1-problem-solution.html
Copyright © 2011-2022 走看看