卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:

每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<),第 2 行给出 K 个互不相同的待验证的正整数 n (1)的值,数字间用空格隔开。

输出格式:

每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

输入样例:

6
3 5 6 7 8 11

输出样例:

7 6
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; namespace ConsoleApp5
{
class Program
{
static int Main(string[] args)
{
//输入数列的长度
int number = Convert.ToInt32(Console.ReadLine());
//列表用来存放最后筛选出来的关键数,方便进行排序
List<int> li = new List<int>();
//用来存储输入的数列的各个数
string[] befnum = new String[number];
//用来存放一个数的卡拉兹数列
int[] solvenum = new int[];
//用来存放关键数,由上述列表转化而来
int[] keynum = new int[number];
int j = ;
int copy = ;
int m = ;
int n = ;
//定义一个二位数组,第一个维度表示数列中的对应数字,第二个维度做为标识符
int[,] record = new int[number, ];
//输入的数列
string info = Console.ReadLine();
//输入的数列按空格分割成各个数
befnum = info.Split(' ');
//初始化record数组
for (int i = ; i < number; i++)
{
record[i, ] = ;
}
//记录数列中每个数的卡拉兹数列
for (int i = ; i < number; i++)
{
copy = Convert.ToInt32(befnum[i]);
j = ;
while (copy != )
{
if (copy % == )
{
solvenum[j] = copy;
copy = copy / ;
j++;
}
else
{
solvenum[j] = copy;
copy = ( * copy + ) / ;
j++;
}
}
//当前数列
for (int l = ; l < number; l++)
{
n = ;
//猜想中的数字
//将当前数列中的每一个数和每个数的猜想数列的各个数比较
for (int k = ; k < j; k++)
{
//如果比较的数是自身就跳过,因为卡拉兹数列的第一个数是他本身
if (Convert.ToInt32(befnum[l]) == solvenum[k])
{
break;
}
else
{
//非自身的数但是被覆盖,卡拉兹数列有数和他相同,结束循环
if (Convert.ToInt32(befnum[l]) == solvenum[k])
{
break;
}
}
//一轮比较下来,既不是自身又没被覆盖则记录符号+1
n++;
//j为卡拉兹数列的长度,一轮下来这个数和卡拉兹数列中的每个数都不相同
if (n == j)
{
//二维标识符++
record[l, ]++;
} }
} }
for (int k = ; k < number; k++)
{
//排除自身当这个数和输入数列中每个数的卡拉兹数列中的各个数都不相同即标识符等于输入数列长度-1
if (record[k, ] == number - )
{
//往列表中加入关键数
li.Add(Convert.ToInt32(befnum[k]));
m++;
}
}
//对列表进行排序
li.Sort();
keynum = li.ToArray();
for (int i = ; i < m - ; i++)
{
Console.Write(keynum[i]);
Console.Write(" ");
}
//最后一个数不带空格
Console.WriteLine(keynum[m - ]);
return ;
}
}
}

这是第一次做的思路,做复杂了,答案输出没有问题但是在PAT官网提交出现了问题求大神help

之后换了一种思路

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks; namespace ConsoleApp5
{
class Program
{
static int Main(string[] args)
{
int type = ;
int copy = ;
int t = ;
//输入数列的长度
int count = Convert.ToInt32(Console.ReadLine());
//输入数列
string info = Console.ReadLine();
//存储后续关键数
int[] answer = new int[count];
int[] key = new int[];
//根据空格分割数列
string[] number = info.Split(' ');
//存放输入数列中的各个数
int[] realnum = new int[count];
//初始化key数组
for (int i = ; i < ; i++)
{
key[i] = ;
}
//将字符串数组转换为整形数组
for (int i = ; i < count; i++)
{
realnum[i] = Convert.ToInt32(number[i]);
}
//冒泡排序,这部我之前没想到,先排序再处理,筛选后的数还是在原来排序基础上的
for (int i = ; i < count - ; i++)
{
for (int j = ; j < count - - i; j++)
{
if (realnum[j] > realnum[j + ])
{
type = realnum[j];
realnum[j] = realnum[j + ];
realnum[j + ] = type;
}
}
}
//检查key,将输入数列中的各个数的卡拉兹数列中的各个数用key数组标识,用卡拉兹数列中的数做为下标,并把以这个下标的key数组中的数置为1
for (int i = ; i < count; i++)
{
copy = realnum[i];
while (copy != )
{
if (copy % == )
{
copy = copy / ;
}
else
{
copy = ( * copy + ) / ;
}
key[copy] = ;
} }
//这个思路是将输入数列中的数和卡拉兹数列中各个数实现一个映射关系,通过key数组这个中介
//判断key数组中以输入数列中的数做为下标的数是否为1,若为1表示被覆盖,为2则表示是关键数
for (int i = ; i < count; i++)
{
if (key[realnum[i]] == )
{
//存入answer数组中
answer[t] = realnum[i];
t++;
} }
//将关键数输出,每个数之间有个空格最后一个数不带空格
int k = ;
for (k = ; k < t - ; k++)
{
Console.Write(answer[k]);
Console.Write(' ');
}
Console.Write(answer[k]);
return ;
}
}
}

在VS上测试没有问题,放到PAT上还是之前的错误求大神指点

我不知道错误错在哪里,还有我return 0了为啥还会有非零返回

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

  1. PAT1005—— 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MSSQL Server 2005 安装补丁出现 Setup Support Files Failure

    给MSSQL Server 2005 安装补丁时出现  Setup Support Files Failure,检查了错误日志,不是系统错误,而是应用错误.出现这个错误的原因:以我的安装为例,我开始装 ...

  2. k8s集群证书过期(kubeadm 1.10.2 )

    1.k8s 集群架构描述 kubeadm v1.10.2创建k8s集群. master节点高可用,三节点(10.18.60.3.10.18.60.4.10.18.60.5). LVS实现master三 ...

  3. kubeadm安装集群系列(kubeadm 1.15.1)

    kubeadm已经进入GA阶段,所以尝试使用kubeadm从零开始安装高可用的Kubernetes集群,并记录下过程和所有坑 本文基于kubeadm 1.15.1 目录 kubeadm安装集群系列-1 ...

  4. 【VS开发】【C/C++开发】传递双重指针申请内存,典型用法

    传递双重指针申请内存,典型用法 指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.如下示例中,Test函数的语句GetMemory(str, 100)并没有使str ...

  5. Node原生demo

    1.=>创建配置模块,作用是先判断是开发环境还是生产环境,并将开发或生产环境的数据库信息和http信息分别筛开,便于选择 2.=>创建数据库模块,作用是连接数据库 3.=>创建路由模 ...

  6. 【Python】【demo实验17】【练习实例】【将一个正整数分解质因数】

    题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 我的源代码: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 ...

  7. python报错及处理 -- 不断总结

    ModuleNotFoundError: No module named 'PIL' 解决方法: 运行命令:pip install Pillow IndentationError: expected ...

  8. ARTS 第一周打卡

    Algorithm : 做一个 leetcode 的算法题 1.只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算 ...

  9. 剑指offer4:重建二叉树(后序遍历)

    1. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4 ...

  10. 并不对劲的CF480E:Parking Lot

    题目大意 有一个\(n\times m\)的网格,每个位置是黑色或者白色.\(k\)个操作,每个操作是将一个白格子染黑,操作后输出当前最大的白色正方形的边长.\(n,m,k\leq 2\times 1 ...