pat 乙级 1005 继续(3n+1)猜想 (25)

来源:互联网 发布:asp新闻发布系统源码 编辑:程序博客网 时间:2024/04/30 04:10


思路就是 定义一个数组 用来标记 每一个递推过程中出现的每一个数字是否出现过 ,出现标记为1;


具体看代码:

#include <stdio.h>#include <iostream>#include <cstdlib>#include <cmath>#include <cctype>#include <string>#include <cstring>#include <algorithm>#include <ctime>using namespace std;int c[100000]={0};     // 注意 这里不要开小了 ..一开始发生断错误就是开小了int main() { int N; cin>>N; int a[N]; int kong=0,num; // 用来格式输出的 for (int i = 0; i < N; ++i) {    cin>>num;    a[i]=num;    if (a[i]==1) continue;    if (c[num]==0)       // 如果未被标记过      {    while (num!=1) {    if (num%2==0)    {    num=num/2;    c[num]++; // 标记为1     }    else {    num=(3*num+1)/2;    c[num]++;   // 标记为1     }    }  } } sort(a,a+N);  // 题目要求 从大到小输出 所以排序 。然后倒着遍历 for (int i=N-1;i>=0;i--) { if (a[i]==1)        // 1 肯定是关键数 { if (kong>0) { cout<<" ";  // 这里是一个格式输出 下面同理  } cout<<"1"; kong++;  } else if (c[a[i]]==0)  // 如果没被标记过 输出即可 {if (kong>0) { cout<<" "; } cout<<a[i]; kong++; } }    return 0;}


AC图:



原创粉丝点击