转跳点:

  ┗|`O′|┛ 嗷~~,这个该死的猜想又来了,难度升级了,如过没写过 P1001 的建议先去看一下。话不多说,看题。

  嗯,这道题就没有那么明确了,呃,也不能这么说,其实也挺明确。就是让你找出在输入样例中出现过但是没有在卡拉兹猜想演算过程中出现过的数。思路也很清晰,不用想的是,如果我们想知道哪个数没有出现,那么就得求出每一个卡拉兹猜想演算的过程出现的数,再记录下来。这个思路代表着我们无法减少卡拉兹计算次数,只能从存储和比较上做优化了,如果我每一个数都用数组把出现过的数都存起来,那么我们不仅浪费空间,而且找未出现的数的时候也十分浪费时间。为了减少时间与空间的成本,我们决定采用计数排序的思想来解决这个问题。

  

void Callatz(int num)
{
while (num != 1)
{
(num % 2) ? (num = (3 * num + 1) / 2) : (num /= 2);
if (num <= 100)
{
FlagArray[num]++; //
}
}
}

    这是计数过程,我们开辟了一个数组,长度大于100,每一步演算过程出现的数都会被 FlagArray[num]++; 所记录 。当我们进行寻找的时候只需要,找出从数组FlagArray的1~n中找到为0 的数即可。

思路比较简单,实现起来有点麻烦

下面是代码:

 1 #include <stdio.h>
2 #include <stdlib.h>
3 #define MAX_SIZE 110
4 int FlagArray[MAX_SIZE];
5 void Callatz(int num);
6 int cmp(const void *a, const void *b);
7
8 int main()
9 {
10 int n;
11 int NumsArray[MAX_SIZE], ans[MAX_SIZE];
12 scanf("%d", &n);
13
14 for (int i = 0; i < n; i++)
15 {
16 scanf("%d", &NumsArray[i]);
17 Callatz(NumsArray[i]);
18 }
19 int j = 0;
20 for (int i = 0; i < n; i++)
21 {
22 if (!FlagArray[NumsArray[i]])
23 {
24 ans[j++] = NumsArray[i];
25 printf("%d ", ans[j-1]);
26 }
27 }
28 putchar('\n');
29 qsort(ans, j, sizeof(int), cmp);
30 for (int i = 0; i < j; i++)
31 {
32 printf("%s%d", i ? " " : "", ans[i]);
33 }
34 putchar('\n');
35
36 return 0;
37 }
38
39 void Callatz(int num)
40 {
41 while (num != 1)
42 {
43 (num % 2) ? (num = (3 * num + 1) / 2) : (num /= 2);
44 if (num <= 100)
45 {
46 FlagArray[num]++;
47 }
48 }
49 }
50
51 int cmp(const void *a, const void *b)
52 {
53 return *(int *)b - *(int *)a;
54 }

  ——算法不易,诸君共勉!

P1005 继续(3n+1)猜想的更多相关文章

  1. 1001. 害死人不偿命的(3n+1)猜想 (15)

    1001. 害死人不偿命的(3n+1)猜想 (15) 较简单,直接代码实现: #include <cstdio> int main() { int n; scanf("%d&qu ...

  2. PAT 乙级 1005. 继续(3n+1)猜想 (25)

    1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B   卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情 ...

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

    1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz ...

  4. PAT乙级 1001. 害死人不偿命的(3n+1)猜想 (15)

    1001. 害死人不偿命的(3n+1)猜想 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Ca ...

  5. PAT-乙级-1001. 害死人不偿命的(3n+1)猜想 (15)

    1001. 害死人不偿命的(3n+1)猜想 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Ca ...

  6. 1001. 害死人不偿命的(3n+1)猜想

    /* * Main.c * 1001. 害死人不偿命的(3n+1)猜想 * Created on: 2014年8月27日 * Author: Boomkeeper *********测试通过***** ...

  7. 9-9害死人不偿命的(3n+1)猜想

    1001. 害死人不偿命的(3n+1)猜想 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Ca ...

  8. PAT (Basic Level) Practice (中文)1001 害死人不偿命的(3n+1)猜想

    1001 害死人不偿命的(3n+1)猜想 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一 ...

  9. (数学) PTA 1005 继续(3n+1)猜想 (25 分)

    1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...

随机推荐

  1. scala的trait执行报错: 错误: 找不到或无法加载主类 cn.itcast.scala.`trait`

    scala的trait执行报错: 错误: 找不到或无法加载主类 cn.itcast.scala.`trait`.Children 原因:包名写成了trait,与trait关键字重名了: package ...

  2. Linux命令:ping命令

    ping命令:类似于windows的ping命令,用于测试网络主机ICMP请求回应的 ping选项 ping -c  #             # 执行次数 -w #             #测试 ...

  3. [HEOI 2013]SAO

    Description 题库连接 给你一个 \(n\) 个节点的有向树,问你这棵树的拓扑序个数,对大质数取模.多测,测试组数 \(T\). \(1\leq n\leq 1000, 1\leq T\le ...

  4. Linux centosVMware php-fpm的pool、php-fpm慢执行日志、open_basedir

    一.php-fpm的pool vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加 include = etc/php-fpm.d/*.conf mkd ...

  5. 使用 C++ 处理 JSON 数据交换格式

    一.摘要 JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传 ...

  6. How to add VTL tapes on DD6300 & label them into "Oracle_VTL" pool

    Dear all , This is  liulei ,   I was back so , How to add VTL tapes on DD6300 & label them into ...

  7. js图片瀑布流效果

    要实现图片瀑布流效果,首先得准备几张图片. html的部分比较简单就是将图片加载到浏览器就可以了 代码如下(注意放的图片多一点要不然之后无法滑动鼠标就无法达到瀑布流效果): <!DOCTYPE ...

  8. Python 之并发编程之进程上(基本概念、并行并发、cpu调度、阻塞 )

    一: 进程的概念:(Process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位. 资源分配:分配的是cpu和内存等物理资源 进程号是进程的唯一标识 同一个程序执行两次之后是两个进程 ...

  9. mkvirtualenv: 未找到命令的解决方法

    1.升级python包管理工具pip pip install --upgrade pip 备注:当你想升级一个包的时候 `pip install --upgrade 包名` 2.python虚拟环境安 ...

  10. 中山Day4——普及

    生活开始日益平淡了呢...今天130分. 收获:归并排序求逆序对 背包问题(01.完全.多重)(外带滚动数组优化) T1:题目链接(才不会告诉你们下面的代码也是洛谷上弄来的) 思路:动态规划.首先,设 ...