uva371 Ackermann Functions

题目: 给你一个公式循环产生数列,指导产生1为止,输出最大的数的位置和数值

注意: 与之前题目的输出是不同的!!!(突然想骂人aaaaaaaa)这次不用考虑输出大小问题

map有自动排序的功能。但因为对map不熟悉(黑脸aaaaaaaaaaa)走了两小时弯路


#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sstream>

#include<cstdio>

#include<iostream>

#include<math.h>

#include <map>

#include <vector>

#include <algorithm>

using namespace std;

long func(long n){

    int h = 1;

    while(1) {

        

        if(n % 2 == 1) {

            h++;

            n = 3 * n + 1;

        }

        if(n % 2 == 0) {

            h++;

            n /= 2;

        }

        if(n == 1) break;

    }

    return h;

}

int main(){

    long a,b;

    map<long, long >num;

    map<long, long >::iterator it;

  //  vector<int> d;

    while((cin>> a >> b)&&(a+b)) {

       // int flag = 1;

        if(a > b){

            long temp = a;

            a = b;

            b = temp;

       //     flag=0;

        }

        for(long i = a; i <= b; i ++) {

            long tmep = func(i);

            it = num.find(tmep); 1️⃣map中find函数找的是num【】括号里的。且find的返回对象是iterator

            if( it != num.end()){

            

            }

            else  num[tmep] = i;

            

        }

        

        it = num.end();

        it--; 2️⃣不知道为什么it只能自增或自减。不能用+1或-1

   // if(flag == 1)

    printf("Between %ld and %ld, %ld generates the longest sequence of %ld values.\n",a,b,it->second,(it->first)-1 );3️⃣直接用num.end()->first会报错

       

    num.clear();

    

    

    }//end-while

    

    

    

    return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值