PAT真题练习1002 写出这个数

题目要求

 

题目的意思显而易见,就是把输入的数字的每一位上的数字加起来,再将得到的这个“求和数”用拼音yi,er,san……表示出来

将数字转成拼音的两种函数:

函数一:

char* transform(int num) {
    char* name = (char*)malloc(5 * sizeof(char));
    switch (num)
    {
    case 0:strcpy(name, "ling"); break;
    case 1:strcpy(name, "yi"); break;
    case 2:strcpy(name, "er"); break;
    case 3:strcpy(name, "san"); break;
    case 4:strcpy(name, "si"); break;
    case 5:strcpy(name, "wu"); break;
    case 6:strcpy(name, "liu"); break;
    case 7:strcpy(name, "qi"); break;
    case 8:strcpy(name, "ba"); break;
    case 9:strcpy(name, "jiu"); break;
    }
    return name;
}

起初是先算出“求和数”,再将“求和数”做求余、整除,再通过此函数得到字符串,将字符串存入数组,再逆向输出。

方法二:

int transform(int num) {
    switch (num)
    {
    case 0:printf("ling"); break;
    case 1:printf("yi"); break;
    case 2:printf("er"); break;
    case 3:printf("san"); break;
    case 4:printf("si"); break;
    case 5:printf("wu"); break;
    case 6:printf("liu"); break;
    case 7:printf("qi"); break;
    case 8:printf("ba"); break;
    case 9:printf("jiu"); break;
    }
    return 0;
}

直接输出拼音

第一种的函数耗费了我大量的时间来思考字符串的定义、拼接,甚至由于VS版本问题对于字符串的初始化都耗费了大量时间。

主体代码:

  函数一对应的代码:

    第一段:

int sum = 0;
    int lenth = 0;
    char str[101];
    char* arr[3]={};
    scanf("%s", &str);
    for (int i = 0; i < strlen(str); i++) {
        sum = sum + str[i] - '0';
    }

核心代码就最后一句(称之为核心代码都有点抱一丝儿),这一句的  -'0'   能将字符转化为数字。

    第二段:

    sprintf(str, "%d", sum);//将“求和数”转为字符串
    lenth = strlen(str);//求和字符串长度,以便锁定后续循环代码的界限
    sum = atoi(str);//将字符串转化为整形,用以求余、整除,利用起第一种函数
    for (int i = 0; i < strlen(str); i++) {
        arr[i] = transform(sum % 10);//从个位开始得出拼音,存入字符串数组
        sum = sum / 10;//整除,从个位开始,消除逐个位数
    }
    for (int k = lenth - 1; k > 0; k--) {//逆向输出拼音,从总长度-1的下标开始,下标为0不再带空格
        printf("%s", arr[k]);
        printf(" ");
    }
    printf("%s", arr[0]);//输出最后一位,不带空格

第二段自我感觉有点繁琐,肯定还可以优化,减少代码量,欢迎评论区讨论 !!!

函数二对应的代码:

    第一段:(相同的配方,一样的味道!大卖特卖!)

int sum = 0;
    int lenth = 0;
    char str[101];
    scanf("%s", &str);
    for (int i = 0; i < strlen(str); i++) {
        sum = sum + str[i] - '0';
    }

   第二段:

    sprintf(str, "%d", sum);//将“求和数”转为字符串
    lenth = strlen(str);//求和字符串长度,以便锁定后续循环代码的界限
    sum = atoi(str);//将字符串转化为整形,用以求余、整除,利用起第一种函数
    int num[3];//题目提到是10^100,也就是一百个0,总共101位,每一位都是9,求和之后也就只有909,总共三位
    for (int i = 0; i < lenth; i++) {//循环求得每一位上的数字,存入num整形数组
        num[i] = sum % 10;
        sum = sum / 10;
    }
    for (int i = lenth-1; i > 0; i--) {//利用函数直接输出对应的拼音即可
        transform(num[i]);
        printf(" ");
    }
    transform(num[0]);

 总结:

在这道题目中学到了,sprintf将整形转化为数组,atoi将字符串转化为整形,都是很便捷的。

①sprintf(XXX,XXX,XXX),共有三个参数。第一个对应字符串的存储对象,第二个对应即将转化为字符串的参数的类型(比如整形转为字符串就填"%d"),第三个对应即将被转化的参数

atoi填一个参数即可。

atoi(str)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值