PAT乙级 1002 写出这个数 (20分)

PAT乙级 1002 写出这个数 (20分)

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100​​ 。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

思路

1)可以将 个 十 百位按位入栈,再依次出栈打印。
2)可以利用sprintf函数,巧妙地实现个 十 百位的分离。

统计信息

在这里插入图片描述

题解 方法一:

#include <cstdio>
#include <stack>
using namespace std;

char num[100][100]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char st1[110],tmps[100];
int summ,isfst=0;
stack<int> out1;

int main(){
    scanf("%s",st1);
    for(int i=0;st1[i];summ+=st1[i++]-'0');
    while(summ){
        out1.push(summ%10); //用栈结构来存储每个位上的数
        summ/=10;
    }
    while(!out1.empty()){
        printf("%s%s",isfst?" ":"",num[out1.top()]);
        out1.pop();
        isfst++;
    }
    return 0;
}

题解 方法二:

#include <cstdio>
#include <cstring>
using namespace std;

const char num[100][100]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char st1[110],tmps[100];
int summ;

int main(){
    scanf("%s",st1);
    for(int i=0;i<strlen(st1);i++)
        summ += st1[i] - '0';
    sprintf(tmps,"%d",summ);  //sprint函数有时候很好用,这里起到整型数转字符串的功能
    for(int i=0;i<tmps[i];++i)
        printf("%s%s",i?" ":"",num[tmps[i]-'0']);
    return 0;
}

题解 方法三:

方法三的代码在方法二的基础上少了几行,值得注意的是第10行,在for循环判定条件那里,我把 i<strlen(st1) 换成了st1[i]。因为字符串的结尾符是’\0’,而’\0’对应的ASCII码正好是0,和False起一样的作用。而更新测试值部分,直接把i++换成了summ+=st1[i++]-‘0’,这样既可以满足更新测试值(指i++),同时完成了循环体该做的事情。

#include <cstdio>
using namespace std;

char num[100][100]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char st1[110],tmps[100];
int summ;

int main(){
    scanf("%s",st1);
    for(int i=0;st1[i];summ+=st1[i++]-'0'); //把语句写在了for循环里面
    sprintf(tmps,"%d",summ);
    for(int i=0;tmps[i];++i)
        printf("%s%s",i?" ":"",num[tmps[i]-'0']);
    return 0;
}

题解 方法四:

改进了一下输入的方法。

#include <iostream>
using namespace std;

char num[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"},st1[110],tmps[100],ch;
int summ,tmpa;

int main(){
    while(scanf("%01d",&tmpa) != EOF) //这样,就算输入是连着一起的数字,也可以一个一个地输入。
        summ += tmpa;
    sprintf(tmps,"%d",summ);
    for(int i=0;tmps[i];++i)
        printf("%s%s",i?" ":"",num[tmps[i]-'0']);
    return 0;
}

错误解法一:

#include <iostream>
using namespace std;

char num[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char st1[110],tmps[100],ch;
int summ;

int main(){
    while(scanf("%c",&ch) != EOF) //个人猜测是这里将文件最后的换行符也进行了处理。
        summ += ch-'0';
    sprintf(tmps,"%d",summ);
    for(int i=0;tmps[i];++i)
        printf("%s%s",i?" ":"",num[tmps[i]-'0']);
    return 0;
}

知识补充 编译器版本:

下面看这一段代码,你觉得他能编译成功么?

#include <iostream>
using namespace std;
int main(){
    printf("The world!");
    return 0;
}

在老版本的编译器标准下是无法编译的(指C++98),而且我在上大学的时候,学到的知识应该是:如果用printf,要 include 如果用cin cout 要include。然而时代变了,在新的C++标准下(c++11, c++14,c++17等),我发现是可以在include的情况下,使用printf()函数。
PAT考试使用的C++编译器版本是多少呢?这个可以在PTA平台官方看到。
在这里插入图片描述
在这里插入图片描述
从这里可以看到,C++编译器版本是c++14,我们可以在Code::Blocks的设置里面修改编译器执行的标准,来获得与PTA平台相似的编译运行环境。
在这里插入图片描述
在这里插入图片描述

知识补充 for循环的执行顺序

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值