会计记账小程序

许久不来,手都有些生疏了。

写个小程序热热手先。

假设有一个数字,可以很大,理论上可以无限大。要如何转成其对应的汉子大写?

就是那种支票本上、汇款单上的那种大写金额。

例如:

    数字:193817071803800182801088108

 

  大写:壹佰玖拾叁亿捌仟壹佰柒拾万柒仟壹佰捌拾亿叁仟捌佰万壹仟捌佰贰拾捌亿零壹佰零捌万捌仟壹佰零捌

代码:

#include <stdio.h>
#include <string.h>

static const char code[9][4]= {"壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

void bit_4(char * s, int n){
    int f = 0;
    switch (n){
    case 4:
        if (s[0] != '0'){
            printf("%s仟", code[s[0] - 49]);
        }
        f = 1;
        s += 1;
    case 3:
        if (s[0] != '0'){
            printf("%s佰", code[s[0] - 49]);
        }
        else if (s[1] != '0') {
            printf("零");
        }
        f = 1;
        s += 1;
    case 2:
        if (s[0] != '0'){
            if (s[0] - 49 > 0 || f == 1){
                printf("%s拾", code[s[0] - 49]);
            }
            else{
                printf("拾");
            }
        }
        else if (s[1] != '0'){
            printf("零");
        }
        s += 1;
    case 1:
        if (s[0] != '0'){
            printf("%s", code[s[0] - 49]);
        }
    default:
        break;
    }
}

void bit_all (char * s, int n){
    if (s[0] == '0'){
        while (s[0] == '0') {
            s += 1; n -= 1;
        }
        if (n > 0){
            printf("零");
        }
    }
    if (n > 8){
        bit_all(s, n - 8);
        printf("亿");
        bit_all(s + n - 8, 8);
    }
    else if (n > 4){
        bit_all(s, n - 4);
        printf("万");
        bit_all(s + n - 4, 4);
    }
    else if (n > 0){
        bit_4(s, n);
    }
}

int main(int argc, char *argv[]){
    int n, i;
    char s[1000] = {'\0'};
    fgets(s, 1000, stdin);
    n = strlen(s);
    s[n - 1] = '\0';
    n = strlen(s);
    for (i = 0; i < n; i++){
        if (s[i] > '9' || s[i] < '0'){
            return -1;
        }
    }
    for (i = 0; i < n && s[i] == '0'; i += 1, n -= 1);
    bit_all(&s[i], n);
    printf("\n");
    return 0;
}

猜你喜欢

转载自liuzhiqiangruc.iteye.com/blog/2263092