【HDU 1032】The 3n + 1 problem

The 3n + 1 problem(题目链接)

思路

  • 思路比较简单,递归加存储

    • 网上有人说,不用存储也能过(没有试)
    • 但是需要注意n的范围,否则数组会越界
    • 因为3*n+1的结果可能比3000000还要大(最开始一直没有想通)
    • 所以超出1000000的数,就不存储
  • 输入的i j不一定是从小到大

代码

#include <iostream>
using namespace std;

//存储n对应的循环长度 
int tab[1000000+10];

//返回n对应的循环长度 
int f(int n){
    if(n == 1)                      //当n为 1,递归出口 
        return 1;                   //循环长度为 1 
    int tmp;                        //计算出的临时变量 
    if(n > 1000000 || tab[n] == 0){ //超出表的范围或还没有计算 
        if(n % 2 == 1){             //奇数 
            tmp = f(3*n + 1) + 1;   //循环长度加 1 
        }else{                      //偶数 
            tmp =  f(n / 2) + 1;    //循环长度也加 1 
        }
        if(n <= 1000000){           //在表的范围内 
            tab[n] = tmp;           //记录在表中 
        }
        return tmp;                 //返回循环长度 
    }
    return tab[n];                  //已经在表中时,直接返回 
}

int main(){
    
    int i, j, t1, t2;               //
    while(cin >> t1 >> t2){         //t1 t2保存输入顺序 
        if(t1 > t2){                //交换t1 t2的位置 
            i = t2;                 //让 i 小于 j 
            j = t1;
        }else{
            i = t1;
            j = t2;
        }
        int max = f(j);             //max先赋值为其中的一个值 
        for(int k = i; k < j; k++){ //循环整个范围(j已经赋值给max) 
            if(f(k) > max){          
                max = f(k);         //记录最大值 
            }
        }
        cout << t1 << " " << t2 << " " << max << endl;
    }
    
    return 0;
}

总结

  • 读题目不太认真,没有看到输出的顺序跟输入要一致
  • 默认i j从小到大
  • 使用数组时,没有考虑到访问越界的情况
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    医学工程与科学园地阅读 4,965评论 0 1
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,750评论 0 2
  • 一缕阳光 洒满金色的沙滩 海水汹涌澎湃 摧毁了千年的水怪 一次次 冲刷着礁石的无奈 美丽的小城 在晨曦里 愈加忙碌...
    小苹果的孤独阅读 1,631评论 0 0
  • 儿女在家与父母最好的沟通方式就是相互理解,而相互理解最高的层次就是懂得“止语”。因为有些理真的是永远都讲不通,道不...
    dream561228阅读 3,477评论 0 51
  • 东钱湖去宁波市区东南约30里,环湖皆山,山峦起伏。其间八十一岭荟萃,七十二溪奔流,众水依势蜿蜒汇聚成湖。据考证,早...
    山海游客阅读 4,819评论 1 3