使用语言:C++
PAT1005 继续(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
解题思路:
按照题目规定,可以设置一个数组,初始值都为0。数字本身被标记为2,被覆盖数字标记为1(原来被标记为2的数字如果被覆盖会重新标记为1)。最后一个数字可能会将之前标记的1改成2,可在设置2之前检测数字是否为1(即之前没有没被覆盖)。
我写完之后扔进去测试,最后两个数据出现了段错误(窒息,后来反复输入,发现上述数组设置太小,将近长度10000才能不越界。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a,int b)
{
return a>b;
}
int main()
{
//在num数组中,1表示被覆盖,2表示关键数;
//key数组用来存储关键数,count为数量
int k, n, count = 0, num[10000] = { 0 }, key[101] = { 0 };
cin>>k;
while(k--){
cin>>n;
// cout<<n<<" ";
//设置被覆盖数
if(num[n] == 0){
num[n] = 2;
}
while(n != 1){
if(n % 2 == 0){
n /= 2;
}
else{
n = (3 * n + 1) / 2;
}
num[n] = 1;
}
// cout<<"test1"<<endl;
}
for(int j = 0;j < 101; j++){
// cout<<num[j]<<" ";
//只有输入数值可能为关键数
if(num[j] == 2){
key[count] = j;
count++;
}
}
// cout<<endl;
//对关键数排序
sort(key,key + count,compare);
for(int i = 0;i < count - 1; i++){
cout<< key[i]<<" ";
}
cout<<key[count - 1]<<endl;
return 0;
}
PAT1006 换个格式输出整数 (15 分)
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
解题思路:
no say
代码:
#include <iostream>
using namespace std;
int main()
{
int n,num[3];
cin>>n;
//保存每位数字
for(int i = 0;i < 3;i++){
num[i] = n % 10;
n /= 10;
// cout<<num[i]<<" ";
}
// cout<<endl;
//按格式输出
for(int j = 0;j < num[2];j++){
cout<<"B";
}
for(int k = 0;k < num[1];k++){
cout<<"S";
}
for(int m = 0;m < num[0];m++){
cout<<m + 1;
}
cout<<endl;
return 0;
}