PTA 币值转换 (20分)

币值转换

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:
输入在一行中给出一个不超过9位的非负整数。

输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:
813227345

输出样例1:
iYbQdBcScWhQdBeSf

输入样例2:
6900

输出样例2:
gQjB

思路:
写之前不清楚中文习惯的可以先看这个 文章
首先按照每4位分一级,分为亿、万等,用数字输入直接余10000就能递归划分了。然后对每一部分处理即可。
pos是判断当前在第几部分,prev是判断前面是否有非零,prev0判断前面有非零后边有零。 因为是对数字处理,所以 假如100001%10000,分成两部分是10 和 1 ,而不是 10和0001,所以需要处理。
最后0要特判。
代码如下:

//https://www.zuoyesou.com/question/szzmdw.html
#include<bits/stdc++.h>
#define fi first
#define se second
#define SZ(x) ((int)x.size())
#define pb push_back
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef long long ll;
template <class T>
inline void read(T &x) {
	x=0;
	int f=0;
	char c=getchar();
	while(!isdigit(c)) {
		f|=(c=='-');
		c=getchar();
	}
	while(isdigit(c)) {
		x=(x<<3)+(x<<1)+c-'0';
		c=getchar();
	}
	if(f) x=-x;
}
const int maxn=1e5+5;
char ut[]={"QBS"},Ut[]={'\0','W','Y'};
ll mx=-1;
void solve(ll n,ll pos){
	if(n>=10000){
		solve(n/10000,pos+1);
	}
	mx=max(mx,pos);
	char s[5];
	sprintf(s,"%lld",n%10000);
//	itoa(n%10000,s,10);
	ll len=strlen(s),prev=0,prev0=0,pr=1;
	rep(i,0,len-1){
		if(s[i]!='0'){
			prev=1;
			if(pos<mx && len!=4 && pr){
				putchar('a');
				pr=0;	
			}
			if(prev0){
				putchar('a');
				prev0=0;
			}
			putchar(s[i]-'0'+'a');
			if(4-len+i>=3){
				prev=0;
				putchar(Ut[pos]);
			}
			else
				putchar(ut[4-len+i]);
		}
		else{
			if(prev){
				prev0++;
			}
		}
	}
	if(prev){
		putchar(Ut[pos]);
	}
}
int main(){
	ll n;
	read(n);
	if(n==0)
		putchar('a');
	else
		solve(n,0);
	return 0;
}
发布了19 篇原创文章 · 获赞 15 · 访问量 2470

猜你喜欢

转载自blog.csdn.net/qq_41829380/article/details/104146860