币值转换
输入一个整数(位数不超过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;
}