pat_1005

PAT A 1005 题解
本文提供了一道PAT A类竞赛题1005的解答方案,该题要求输入一个字符串并输出其各个数字字符之和的英文单词表达。代码中包含了完整的C++实现细节,并进行了特判处理。

源地址:http://www.patest.cn/contests/pat-a-practise/1005

模拟题,注意一下,ans可能为0,这个需要特殊判断,考虑全面就行了。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<set>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-3
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
#define ll __int64
int n,m;
#define Mod 1000000007
#define N 510
#define M 1000100
const int size = 10010;
const int mod = 9901;
int vis[N];
char ch[15][15] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
char s[N];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    while(scanf("%s",s)!=EOF){
    	int len = strlen(s);
    	int ans = 0;
    	for(int i=0;i<len;i++)
    		ans += (s[i]-'0');
    	if(ans == 0){						//特判
    		printf("%s\n",ch[0]);
    		continue;
    	}
    	vector<int> v;
    	while(ans){
    		int h = ans%10;
    		v.push_back(h);
    		ans /= 10;
    	}
    	int size = (int)v.size();
    	printf("%s",ch[v[size-1]]);
    	for(int i=size-2;i>=0;i--)
    		printf(" %s",ch[v[i]]);
    	printf("\n");
    }
return 0;
}


03-09
<think>好的,我现在需要帮助用户查找PAT 1005相关的题目和解答。用户提到的是PAT乙级1005题,题目名称是“继续(3n+1)猜想”。根据引用[2],里面确实列出了PAT乙级-1005这个题目,所以应该参考这个来源。 首先,我需要确认用户的需求是否明确。用户可能正在准备PAT考试,遇到了这个题目,需要题解或者代码示例。根据引用[2],用户已经提供了题目名称,接下来需要详细解答。 接下来,我需要回忆PAT 1005的具体内容。题目大致要求是,给定一系列正整数,进行(3n+1)猜想中的计算步骤,找出那些不是其他数的覆盖数的数,并按降序输出。覆盖数指的是在计算过程中被覆盖的数。 然后,需要确定正确的解题思路。通常,这类题目需要遍历每个数,记录每个数在计算过程中生成的所有中间数,然后检查哪些数没有被其他数的中间数覆盖。最后将未被覆盖的数排序输出。 根据引用[3]中的代码结构,可能涉及到数组操作和循环。不过引用[3]是关于求和的简单题目,可能与本题关系不大。需要看引用[1]中的代码是否相关。引用[1]中的代码是关于动态规划的,可能不适用于本题,但可以作为参考代码结构。 用户可能需要具体的步骤解释和代码实现。例如,如何标记覆盖数,如何筛选未被覆盖的数,如何排序输出。此外,需要注意边界条件,比如输入的数可能重复,或者如何处理大数的情况。 还需要考虑如何优化算法,避免重复计算。例如,可以用哈希表或者数组来记录已被覆盖的数,这样在后续处理中可以快速判断某个数是否被覆盖。 最后,根据用户提供的引用[2],确认题目的存在,并给出对应的解答。确保代码正确,并解释关键步骤,如计算覆盖数、筛选关键数、排序输出等。同时,提醒用户注意测试用例,例如输入中有多个相同数的情况,或者所有数都被覆盖的情况。</think>根据您的要求,我为您整理了PAT乙级1005题"继续(3n+1)猜想"的详细解答: ### PAT乙级1005题解 **题目描述**: 给定一系列正整数,进行(3n+1)猜想中的计算步骤,找出所有未被其他数覆盖的关键数,并按降序输出。覆盖数指在计算过程中生成的中间数[^2]。 **解题思路**: 1. **标记覆盖数**:对每个输入数执行(3n+1)运算,记录所有中间数 2. **筛选关键数**:排除被其他数的运算过程覆盖的数 3. **排序输出**:将剩余数按降序排列 **核心算法步骤**: $$ \text{当n为奇数时:} n = (3n+1)/2 \\ \text{当n为偶数时:} n = n/2 $$ **C++代码实现**: ```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; int main() { int k, n; cin >> k; vector<int> nums(k); unordered_set<int> covered; // 读取输入并标记覆盖数 for(int i=0; i<k; i++){ cin >> n; nums[i] = n; while(n != 1){ n = (n%2) ? (3*n+1)/2 : n/2; covered.insert(n); } } // 筛选关键数 vector<int> res; for(int num : nums){ if(!covered.count(num)) res.push_back(num); } // 排序输出 sort(res.rbegin(), res.rend()); for(int i=0; i<res.size(); i++){ cout << res[i] << (i == res.size()-1 ? "" : " "); } return 0; } ``` **关键点说明**: 1. 使用哈希表`unordered_set`存储覆盖数,查询效率$O(1)$ 2. 通过`sort(rbegin(), rend())`实现降序排列 3. 输入时直接记录原始数值,最后筛选未被覆盖的数 **测试样例**: 输入: 6 3 5 6 7 8 11 输出: 7 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值