幣值轉換
輸入一個整數(位數不超過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;
}