/*
1005. 继续(3n+1)猜想 (25) 卡拉兹(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.降序排序(选择排序):原因-要按从大到小的顺序输出关键数字
2.依次对元素计算Callatz猜想步骤(递归法):
0.对元素的Callatz猜想执行步骤进行统计count_steps,先初始化为0;
1.若count_steps == 0,则说明为元素本身,不属于被覆盖其它元素之列;若count_steps>0,进行元素覆盖标记;
1.判断当前数值是否为1,若为1,返回步数值,算法终止,结束;反之,进入步骤2;
2.判断当前数值奇偶性,若为偶数,n折半,步数+1,进入步骤3;若为奇数,(3n+1)折半,步数+1,进入步骤3;
3.输出所有未被标记的元素值。 注意事项:
字符串与数值相互转换(详情见博客:http://www.cnblogs.com/johnnyzen/p/8835132.html)
#include <stdio.h>//sprintf
int sprintf( char *buffer, const char *format, [ argument] … );
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
#include <stdlib.h>//atof,atol,strtod,strtol
*/ #include<stdio.h>
#include<string.h>
#include<string>
using namespace std; int count_steps = 0;
int *elements;//元素数组
int *elements_tags;//标记元素是否被覆盖过
int elements_length; //step1:降序排序(选择排序法)
void Sort(int *elements){
int flag,tmp;
for(int i=0;i<elements_length;i++){
flag = i;
for(int j=i+1;j<elements_length;j++){
if(elements[j]>elements[flag]){//每一趟,从第i+1开始,找最大值
flag = j;
}
}
if(flag != -1){
tmp = elements[i];
elements[i] = elements[flag];
elements[flag] = tmp;
}
}
} //标记元素
void TagElement(int value){
for(int i=0;i<elements_length;i++){
if(elements[i] == value){
elements_tags[i] = 1;
}
}
} //step2:对数组元素依次进行卡拉兹猜想验证
int Callatz(int num){
if(count_steps != 0){
TagElement(num);//对除了当期运算的本身元素以外的(被覆盖)元素进行标记
}
if(num == 1)
return count_steps;
count_steps++;
if(num % 2 == 0){
return Callatz(num / 2);
} else {
return Callatz( (3 * num + 1) / 2);
}
} void Input(int *elements){
for(int i=0;i<elements_length;i++){
scanf("%d", elements+i);
elements_tags[i] = 0;//初始化标记数组
}
} //test
void print(int *elements, int length){
for(int i=0;i<length;i++){
printf("%d ", elements[i]);
}
printf("\n");
} int main(){
char output_str[1000];
output_str[0]='\0';//注意:记得初始化被处理字符串,否则,可能出现字符串乱码!!!
char tmp[10];
scanf("%d", &elements_length);
elements = new int [elements_length];
elements_tags = new int [elements_length]; Input(elements);
Sort(elements);
//print(elements, elements_length);//test
for(int i=0;i<elements_length;i++){
count_steps = 0;//初始化
Callatz(elements[i]);
} //print(elements_tags, elements_length);//test
for(int i=0;i<elements_length;i++){
if(elements_tags[i] == 0){
sprintf(tmp, "%d", elements[i]);//将数值转字符串
strcat(output_str, tmp);
strcat(output_str, " ");
} }
output_str[strlen(output_str)-1] = '\0';
printf("%s", output_str);
return 0;
}
/*
6
3 5 6 7 8 11
*/

  

[C++]PAT乙级1005. 继续(3n+1)猜想 (25/25)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 1005 继续(3n+1)猜想 (25 分)

    1005 继续(3n+1)猜想 (25)(25 分) - 过期汽水的博客 - CSDN博客https://blog.csdn.net/qq_40167974/article/details/80739 ...

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

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

  8. 1005 继续(3n+1)猜想 (25 分)

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

  9. 【PAT】1005. 继续(3n+1)猜想 (25)

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

随机推荐

  1. http://bsideup.blogspot.com/2015/04/spring-boot-thrift-part3.html

    Building Microservices with Spring Boot and Apache Thrift. Part 3. Asynchronous services Posted on 4 ...

  2. Git多个SSH KEYS解决方案(含windows自动化、TortoiseGit、SourceTree等)

    工作过程中,经常会使用到多个git仓库,每个git仓库对应一个账号,可以理解为每个git仓库对应一个ssh key,因此我们需要管理多个ssh key.   一.快速创建ssh key   1. 创建 ...

  3. jokes

    先看效果如下 目录如下 //index.html <!DOCTYPE html> <html lang="zh-CN"> <head> < ...

  4. pyinstall实现不显示控制窗口

    做图形界面的时候,总会弹出一个cmd的黑框框,为了美观,通常希望将其隐藏. 查找资料得知:1.pythonw.exe .py不会出现(此方法没试过) 2.python.exe .pyw即将py文件的后 ...

  5. Ubuntu下使用sublime text进行py开发

    放弃了,半天弄不出一个方便的开放环境,还是现成的iDE方便 下载方法 https://www.sublimetext.com/docs/3/linux_repositories.html 首先安装Pa ...

  6. C++ Exception机制

    C++异常机制的执行顺序. 在构造函数内抛出异常 /* * ExceptClass.h * * Created on: 2018年1月2日 * Author: jacket */ #ifndef EX ...

  7. hdu 2159FATE(完全背包)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 思路一:完全背包转“01”背包 考虑到第ki个怪最多杀min(m/b[ki],s ...

  8. Gym102082 G-What Goes Up Must Come Down(树状数组)

    Several cards with numbers printed on them are lined up on the table. We’d like to change their orde ...

  9. Linux平台中使用PHP让word转pdf

    1.ubantu下安装libreoffice        sudo apt-get install libreoffice 2.命令行执行word转pdf    将 /home/wordToPdf/ ...

  10. 流畅的python--2 序列构成的数组

    我们把文本.列表和表格叫做数据火车...FOR命令通常能作用于数据火车上.      ---ABC Programmer's Handbook 不管是哪种数据结构,字符串.列表.字节序列.数组.XML ...