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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章