题目描述

卡拉兹(Callatz)猜想:

对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步

得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,

结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1?

输入描述:

每个测试输入包含1个测试用例,即给出自然数n的值。

输出描述:

输出从n计算到1需要的步数。

输入例子:

3

输出例子:

5

这一问较简单,AC代码:
 #include <iostream>
using namespace std; class Solution{
public:
int Callatz(int n)
{
int rtn=;
while(n != )
{
if(n% == )
{
n /= ;
++rtn;
}
else
{
n = (*n+)/;
++rtn;
}
}
return rtn;
}
}; int main()
{
Solution s;
int n;
cin >> n;
cout << s.Callatz(n);
}

题目描述

卡拉兹(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(<100),第2行给出K个互不相同的待验证的正整数n(1<n<=100)的值,数字间用空格隔开。

输出描述:

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

输入例子:

6

3 5 6 7 8 11

输出例子:

7 6

  如果只是把覆盖的数放入一个数组,然后再从输入中逐个比对,也可以找出关键数。
  这里我采用了桶排的一种思路:因为输入有严格的限制,待输入的数在1-100之间。所以我定义一个150大小的数组(分配在对空间,因为OJ系统对栈有严格的大小限制)。为什么会是150大小呢?这是由于如果输入的书中最大的数是99 时,能产生的最大下标就是 149.这样做的好处就是,在后边的处理中,可以放开干,不要担心数组越界,最直观的好处就是省掉了一些if判断语句。当然这点影响还是很细微的。数组记得清0;
  首先,从输入中把这些代验证的数读入,再将它们对应下标的那个数置1(如读入input,那么array[input]=1,这里像桶排有木有!)。
  这是所有出现的数,以他们当下标的数都已经置1了。这时候开始以这些数值为1的数,依次来处理他们的下标:找出这个数覆盖了那些数,然后判断以这些数为下标的数是否是1(是输入中的数),是1 就 +=1(这个数可以被其它数覆盖)。最后只需输出数组中值为1的下标。 代码:
 //有点像桶排 O(∩_∩)O
#include <iostream>
using namespace std; class Solution {
public:
void input()
{
int size;
cin >> size;
//已经足够大,最大是输入99时,对应(99*3+1)/2 是 149
//虽然这之后的用不到,但是我以为效率高,少了判断
int* num = new int[];
for(int i=;i<;++i)
num[i] =;
int tmp;
for(int i=;i<size;++i)
{
cin >> tmp;
num[tmp] = ;
}
Callatz(num);
delete[] num;
}
void Callatz(int* num)
{
for(int i=;i<=;++i) { //
if (num[i] == )
{
int tmp =i;
while(tmp != )
{
if(tmp%){
tmp = (tmp*+)/;
if(num[tmp] == )
num[tmp] +=;
}
else {
tmp /= ;
if(num[tmp] == )
num[tmp] += ;
}
}
}
}
bool isBiggest = true;
for(int i=;i>-;--i)
{
if(num[i] == ) {
if(!isBiggest)
cout << ' ';
cout << i;
isBiggest = false;
}
}
}
}; int main()
{
Solution s;
s.input();
}

卡拉兹(Callatz)猜想的更多相关文章

  1. shell练习--PAT题目1001:卡拉兹(Callatz)猜想(失败案例)

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...

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

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...

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

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

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

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

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

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

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

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在1950年的世界 ...

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

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

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

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

  9. PAT (Basic Level) Practise:1005. 继续(3n+1)猜想

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

随机推荐

  1. sencha combobox下拉框不用jsonstore,直接使用字符串数组做数据源

    combobox下拉框的store除了可以选择一个jsonstore来加载数据,还可以直接使用符串Array做数据源. { xtype: 'combobox', fieldLabel: 'Label' ...

  2. 转载 教你使用PS来制作unity3D随机地形

  3. 设计模式之桥接模式(Bridge)

    注:本文不属于原创,而是根据原文重新整理,原文是:我给媳妇解释设计模式:第一部分 设计模式不是基于理论发明的.相反,总是先有问题场景,再基于需求和情景不断演化设计方案,最后把一些方案标准化成“模式”. ...

  4. jquery重置html form

    很多时候在ajax提交或者对话框隐藏之后,我们希望重置默认值以便下次打开对话框时保持干净. 因为jquery选择器返回的是list,并且没有对此提供reset方法,所以需要针对单个元素进行reset. ...

  5. Linux 学习手记(4):Linux系统常用Shell命令

    日期时间 date命令:显示当前时间日期 date -u # 显示格林威治(UTC)事件 date +%Y-%m-%d # 格式显示日期 date -s '20:25:25' # 修改系统时间,需要使 ...

  6. ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制

    1.前言 a.微软对ASP.NET的开发从WebForm到MVC的转变,已经正式过去5,6个年头,现在WebForm和MVC也都越来越完善,小小算来我也已经工作了将近三年,从大学的时候学习ASP.NE ...

  7. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q127-Q130)

    Question 127You create a custom list named Products.You need to perform a Representational State Tra ...

  8. 利用在线工具自动化生成findviewById

    我们在编码的时候经常会用到findviewById,不厌其烦,我之前介绍过一个很取巧的方法,挺好用的,这里再贴一下: public class KaleBaseActivity extends Act ...

  9. 更轻量的 View Controllers

    iew controllers 通常是 iOS 项目中最大的文件,并且它们包含了许多不必要的代码.所以 View controllers 中的代码几乎总是复用率最低的.我们将会看到给 view con ...

  10. iOS项目上传到AppStore步骤流程

    1.登录developer.apple.com 2.点击member center后 进下图 3.点击certificates Identifiers进下图 4.点击Certificates进下图,首 ...