作者csihcs (非天夜翔)
看板C_and_CPP
标题Re: [问题] 在dev c++测试过了 在测验网站上测资不 …
时间Tue Oct 20 12:04:24 2009
string convertL(long long);
int main(int argc, char* argv[]) {
int digit[] = {922,3372,10,10,5807};
long long n = 0;
for(int i = 0; i < 5 ; i++) {
n *= 10000;
n += digit[i];
}
cout << n << "=" << convertL(n) << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
string unit[] = {"","万","亿","兆","金"};
string num1[] = {"零","壹","贰","参","肆","伍","陆","柒","捌","玖"};
string num2[] = {"","拾","佰","仟"};
EX: 1234 从 4 开始往前转换
若不为 4 位数,则 *zero 保证 true,且 loop 只跑到不为 0 的位数结束
若为 4 位数且无任何 0,则 loop 等同於
do {
s.insert(0,num1[inNum%10],num2[i]);
inNum /= 10;
i++;
} while(inNum > 0);
出现非 0 数後,出现第一次 0,则补,其余不补,ex: 1001
^^补
|不补
string convert4(int fourDigitNum, bool *zero) {
string s;
int i = 0,digit;
bool appearNoneZero = false;
do {
digit = fourDigitNum % 10;
fourDigitNum /= 10;
if(digit > 0) {
s.insert(0,num1[digit]+num2[i]);
appearNoneZero = true;
} else if(!(*zero) && !appearNoneZero)
s.insert(0,num1[digit]);
*zero = (digit == 0);
i++;
} while(fourDigitNum > 0);
if(i < 4)
*zero = true;
return s;
}
为 0 就不转换
num < 0 ,则负号保留,num 看成 -num 转换
每 4 位数一轮,当轮不为 0,则
先检查前一轮首位为 0 且曾出现不为 0 的数,则补"零"
再插入当轮的数和单位
否则纪录当轮首位为 0
最後看是否需要加"负"
string convertL(long long num) {
string s;
if(num == 0)
return s.insert(0,num1[0]);
int i = 0,FDN = 0;
bool zero = false,tailZero = true;
bool neg = (num < 0);
num *= (neg ? -1 : 1);
do {
FDN = (int)(num % 10000);
num /= 10000;
if(FDN > 0) {
if(zero && !tailZero)
s.insert(0,num1[0]);
s.insert(0,convert4(FDN,&zero)+unit[i]);
tailZero = false;
} else
zero = true;
i++;
} while (num > 0);
s.insert(0,(neg ? "负" : ""));
return s;
}
※ 引述《Yshuan (倚弦)》之铭言:
: 看完题目个人的想法是以下...
: String sta[]; // 用来储存输出
: int top //配合sta仿stack结构
: bool dirty;
: void main(){
: int n; //input number
: sta = new;
: top = 0;
: String[] word = {"","万","亿","兆","金"...};
: int word_cnt = -1;
: int remain;
: while(n > 0){
: word_cnt++;
: sta[top++] = word[word_cnt];
: remain = n%10000;
: n = n / 10000;
: convert_four(remain);
: }
: for(int i=top;i>=0;i--)
: cout<<sta[i];
: ...
: }
: void convert_four(int n){
: String[] word = {"", "拾", "佰", "仟"};
: int word_cnt = -1;
: int remain;
: dirty = f; //初始化成 if(r==0)不补零
: while(n > 0){
: word_cnt++; // start increaing from 0
: sta[top++] = word[word_cnt]; //预设都放入word
: remain = n % 10;
: n = n/10;
: if(remain==0){
: sta[--top] = ""; //没有余数word拿出
: if(dirty){ //跳过需补零 dirty 防止连补两次以上
: sta[top++] = "零";
: dirty = f;
: }
: break; //跳出回圈 不做convert();
: }
: convert(remain); //将余数转成一到九
: }
: }
: void convert(int r){
: dirty = t; //补零开关打开
: switch(r) //那个浩大的switch
: case ?:
: sta[top++] = "数字一到九其中一个"; //九个case去冲
: ...
: }
: ----------------------------------
: 囧 不自觉得都打了 精神是stack
: 先以四个位数为单位写成一个四位数转换函数
: 因为中文读法规则 习惯以10^4为一个大单位...
: 十百千都重复 故写成 convert_four(int)
: 不断的取remain 并且若不是零就call convert(int)
: 关於放零的动作用了一个bool开关 可能有点复杂
: ...
: 然後整个写完之後 才发现网站是高中生程式 XD
: 假如原PO 能google stack然後看懂这篇code
: 相信大学上资结会快速上手 XD! 关键字 >>> "先进後出"
: 至於你原本的code 我大概懂你的概念是先一对一转换
: 再比对零的分布情形 做输出零的调整
: 个人感觉分布组合太多种 所以就不使用一堆if的写法了...
: 也许有点小题大做了吧 ~ ^^! 还请板上其他高手指正一下~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.74.9.2
※ 编辑: csihcs 来自: 211.74.9.2 (10/20 12:50)
※ 编辑: csihcs 来自: 211.74.9.2 (10/22 00:16)