7-23 币值转换 (20 分)

本文介绍了一种将整数转换为中文大写金额的算法实现,通过使用字符数组来映射数字和单位,实现了从阿拉伯数字到中文大写金额的转换。代码详细展示了如何处理万和亿级别的数字,并提供了去除零的优化方法。

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

我写的代码其实是烂代码,比好的答案长很多,不过它有一定的通用性,记录一下。实际解题竞赛里面,代码越短越好,通不通用不是最重要的。。毕竟考试时间就那么点。

#include <stdio.h>
#include "string.h"
int main(){
    long n;
    char unit[][4]={"S","B","Q","W","Y"};//{"拾","百","仟","万","亿"}
    char num[][4]={"a","b","c","d","e","f","g","h","i","j"};//{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    char out[100][4];
    int i,j=0,len;
    scanf("%ld",&n);
    if(n==0){
        printf("%s\n",num[0]);
        return 0;
    }
    for(i=0;n>0;i++){
        
        int t=n%10;
        if(t || i==4){
            if(i-1>=0){
                if(i-1<4){
                    strcpy(&out[j++], &unit[i-1]);
                }else{
                    if(i-5>=0){
                        if(i-5<=2){
                            strcpy(&out[j++], &unit[i-5]);
                        }else if(i==8){
                            strcpy(&out[j++], &unit[4]);
                        }
                        
                    }
                }
                
            }
        }
        
        strcpy(&out[j++], &num[t]);
        //printf("%s",num[t]);
        n/=10;
    }
    len=j;
    
    for(int k=0;k<len;k++){
        if(strcmp(&out[k], &num[0])!=0){
            break;
            
        }else{
            strcpy(&out[k],"");
        }
        
    }
    
//    for(j=len-1;j>=0;j--){
//        printf("%s",out[j]);
//    }
//    printf("\n");
    
    int flag=0;
    for(int k=0;k<len;k++){
        if(strcmp(&out[k], &num[0])==0 && flag ==1){
            strcpy(&out[k],"");
        }else if(strcmp(&out[k], &num[0])==0 && flag ==0){
            flag=1;
            
        }else if(strcmp(&out[k], &num[0])!=0 && flag==1){
            flag=0;
        }
    }

    for(int k=0;k<len;k++){
        if(strcmp(&out[k], &unit[3])==0 && strcmp(&out[k+1], &num[0])==0){
            strcpy(&out[k+1],"");
        }
    }
    
    for(j=len-1;j>=0;j--){
        printf("%s",out[j]);
    }
    
    printf("\n");
    
    return 0;
    
}

 

PTA(Programming Teaching Assistant)平台上的币值转换问题通常是将给定的数字金额按照中文币值的规则进行转换。以下是实现思路和Python代码示例: ### 实现思路 1. **数字段处理**:将输入的数字按每四一组进行划,因为中文币值单位是“万”“亿”等,每四对应一个大的单位。 2. **处理每四位数字**:对于每四位数字,将其转换为中文数字和对应的单位(如“千”“百”“十”)。 3. **处理大单位**:根据段情况,添加“万”“亿”等大单位。 4. **特殊情况处理**:处理零的情况,避免出现多个连续的零等。 ### 代码示例 ```python # 中文数字映射 chinese_num = [&#39;零&#39;, &#39;一&#39;, &#39;二&#39;, &#39;三&#39;, &#39;四&#39;, &#39;五&#39;, &#39;六&#39;, &#39;七&#39;, &#39;八&#39;, &#39;九&#39;] # 中文单位映射 chinese_unit = [&#39;&#39;, &#39;十&#39;, &#39;百&#39;, &#39;千&#39;] # 大单位映射 big_unit = [&#39;&#39;, &#39;万&#39;, &#39;亿&#39;] def four_digits_to_chinese(num_str): result = &#39;&#39; has_non_zero = False zero_flag = False for i, digit in enumerate(num_str): digit = int(digit) if digit == 0: zero_flag = True else: if zero_flag: result += &#39;零&#39; zero_flag = False result += chinese_num[digit] + chinese_unit[3 - i] has_non_zero = True if result.endswith(&#39;零&#39;): result = result[:-1] if not has_non_zero: result = &#39;零&#39; return result def num_to_chinese(num): num_str = str(num) num_len = len(num_str) segments = [] while num_str: segments.append(num_str[-4:].zfill(4)) num_str = num_str[:-4] result = &#39;&#39; for i, segment in enumerate(segments): segment_chinese = four_digits_to_chinese(segment) if segment_chinese != &#39;零&#39; or (i == 0 and len(segments) == 1): result = segment_chinese + big_unit[i] + result if result.startswith(&#39;零&#39;): result = result[1:] if result.endswith(&#39;零&#39;): result = result[:-1] return result # 示例使用 num = 123456789 print(num_to_chinese(num)) ``` ### 复杂度- **时间复杂度**:$O(n)$,其中 $n$ 是输入数字的位数- **空间复杂度**:$O(n)$,主要用于存储转换后的中文币值字符串。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值