1002 写出这个数 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

C算法实现:

#include<stdio.h>
int main(){
int sum=0,k=0,sum1,s[15];
char ch;
//每次读取一个数
ch = getchar();
while(ch!='\n'){
switch(ch){
case '1':sum=sum+1;break;
case '2':sum=sum+2;break;
case '3':sum=sum+3;break;
case '4':sum=sum+4;break;
case '5':sum=sum+5;break;
case '6':sum=sum+6;break;
case '7':sum=sum+7;break;
case '8':sum=sum+8;break;
case '9':sum=sum+9;break;
case '0':sum=sum+0;break;
}
ch = getchar();
}
//printf("%d",sum);
sum1=sum;
//判断是几位数
while(sum1){
sum1=sum1/10;
k++;
}
for(int i=k-1;i>=0;i--){
s[i]=sum%10;//分别求每位数
sum=sum/10;
} for(int i=0;i<k;i++){
switch(s[i]){
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;
case 0:printf("ling");break; }
if(i!=(k-1))
{printf(" ");}
else{
printf("\n");
} }
return 0;
}

思想:由于输入的数可达10的100次方,所以用数组存储不现实,因此可将数字作为字符输入,用getchar方法循环获取一个数,当获取到的字符为回车(‘\n’)时停止,再用switch进行判断,即可求出所有数之和,定义一个k来标记是几位数,再用数组存储每一位上的数字,最后对应字符串输出

算法二(一点点小改进,C++实现):

#include<bits/stdc++.h>//通用懒人写法,包含所有的库函数,由于本人还没来得及系统学习stl,也一般不会						//涉及到高级的库函数,所以就这么写了,建议还是系统学习stl
using namespace std;
int main(){
string n;
cin>>n;
int i=0,sum=0,sum1,k=0,s[10];
while(n[i]!='\0'){
sum=sum+(n[i]-'0');
i++;
}
//cout<<sum; sum1=sum;
//判断是几位数
while(sum1){
sum1=sum1/10;
k++;
}
for(int i=k-1;i>=0;i--){
s[i]=sum%10;//分别求每位数
sum=sum/10;
} for(int i=0;i<k;i++){
switch(s[i]){
case 1:cout<<"yi";break;
case 2:cout<<"er";break;
case 3:cout<<"san";break;
case 4:cout<<"si";break;
case 5:cout<<"wu";break;
case 6:cout<<"liu";break;
case 7:cout<<"qi";break;
case 8:cout<<"ba";break;
case 9:cout<<"jiu";break;
case 0:cout<<"ling";break; }
if(i!=(k-1))
{cout<<" ";}
else{
cout<<endl;
}
}
return 0;
}

思想:将要输入的变量定义为一个字符串,当输入的字符为‘\0’,也就是回车时,结束输入(‘\0’获取不到),所得的字符串可以直接作为数组使用,通过下标获取元素,当所得字符为数字时,可以用s[i]-'0'将数字字符转化为int类型的数字进行四则运算。

算法三(贴一个大佬的简洁代码,供参考学习)

#include <iostream>
using namespace std;
int main()
{
int sum = 0;
char ch, s[4]; //ch作为临时变量保存输入的每一个字符,s保存sum的每一个数字 ,因为题目小于1000
char b[10][5] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
while ((ch = getchar()) != '\n') //如果一直输入字符,不按回车的话
sum += (ch - '0');
sprintf_s(s, "%d", sum); // sprintf(char *buffer, const char *format,[ argument])将任意类型数据按某种格式转换成字符串
for (int i = 0; s[i] != 0; i++) {
if (i > 0) //消除第一个空格
printf(" ");
printf("%s", b[s[i] - '0']);
}
return 0;//上文sprintf中s为s[4]数组名,将sum的值存放在s中
}

几点思考:

  1. 可以把相应的格式字符串存储到字符数组中,char b【10】【5】中的5代表最大长度(10行5列)

  2. 本题的精华所在,之前的做法都是想着判断所得到的数是几位数,再如何把每位上的数字存下来,所以用了for循环判断,而c++的库函数sprintf_s()提供了这个功能,不过有以下注意点(感谢评论大佬!!!):

    • 带“_s”后缀的函数一般是为了让原版函数更安全,编译器(如VS)提供了sprintf_s()的话,不会出现编译错误,而PAT应该是没有提供的,所以需要去掉“_s”后缀。
    • 但是在vs里反而是sprintf不让用,一定要你用sprintf_s
  3. 可用%s直接输出字符数组中的所有字符

PTA1002 写出这个数 (20 分)的更多相关文章

  1. PAT Basic 1002 写出这个数 (20 分)

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1. 输出格式: 在一行内输出 n 的 ...

  2. 1002 写出这个数 (20 分) java解题

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10^100. 输出格式: 在一行内输 ...

  3. PAT-字符串处理-B 1002 写出这个数 (20分)

    题目: 思路: 先用字符串数组存储输入数字,然后依据num[i]-'0'对输入数字求和.然后对求和后的数字,进行分割,存储到数组中,然后遍历数组,依据存储汉语拼音的字符串二维数组进行输出 注意点: 注 ...

  4. PAT 1002 写出这个数 (20)(代码)

    1002 写出这个数 (20)(20 分) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10^100 ...

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

    1002. 写出这个数 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 读入一个自然数n,计算其各位数字 ...

  6. PAT-乙级-1002. 写出这个数 (20)

    1002. 写出这个数 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 读入一个自然数n,计算其各位数字 ...

  7. [C++]PAT乙级1002.写出这个数(20/20)

    /* 1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10^100. ...

  8. 【PAT】1002. 写出这个数 (20)

    1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式 ...

  9. PAT 乙级练习题1002. 写出这个数 (20)

    1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式 ...

  10. PAT 1002. 写出这个数 (20)

    读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字之和的每 ...

随机推荐

  1. Redux Toolkit——基操

    redux-toolkit是redux的升级版 安装 npm install @reduxjs/toolkit // 在react中还需要搭配react-redux使用 npm install rea ...

  2. JS中函数的length以及arguments的length如何得到?

    function a(x,y){} a.length // 2 function b(x,y=2,z){} b.length // 1 function c(x,...args){} c.length ...

  3. MySQL skip_name_resolve参数的设置

    Skip_name_resolve Dynamic No Default Value OFF 默认值是off,也就是在检查客户端连接时在第一次要解析主机名(如果有开启DNS服务器,则做 " ...

  4. redhat7

    systemctl systemctl enable sshd 开机启动某服务 systemctl disable sshd 开机不启动某服务 systemctl is-enabled sshd查看某 ...

  5. nginx代理出现上传文件过大解决办法

    1.错误描述 2.错误原因 1.上传文件时,利用localhost访问系统,不会出现这个问题:用域名访问这个系统时,出现这个问题,提示是:请求实体太大 由于Nginx反向代理服务器client_max ...

  6. iOS开发 WKWebView实现JS交互

    需求:利用webView加载H5页面,并实现点击H5页面的按钮触发事件,事件是调用OC的方法.简单说就是JS调用OC的方法,这里我们选择的是WKWebView,至于为什么不用UIWebView,自行百 ...

  7. 2022-4-6内部群每日三题-清辉PMP

    1.产品负责人一直听取一个项目干系人的意见,远远超过其他项目干系人.敏捷管理专业人士应该怎么做? A.允许这名干系人和产品负责人自己解决问题. B.与这名干系人安排一次私人会议,以澄清他们的需求. C ...

  8. Linux-crontab定期执行程序的命令

    https://www.runoob.com/linux/linux-comm-crontab.html Linux crontab 是用来定期执行程序的命令. 当安装完成操作系统之后,默认便会启动此 ...

  9. Unity 消息机制

    最近有新项目需要和同事合作开发,他做UI 我做网络层,做着做着发现 如果我们要相对独立完成自己的开发任务,那我们的代码耦合得减少,不然 一个人代码有大改的时候,另一个人也要进行大幅修改,这样不便于后期 ...

  10. Visaul Studio 快捷方式

    1.删除光标所在行:Ctrl + shift + L : 2.剪切光标所在行:Ctrl + X : 3.在光标上方插入一行:Ctrl + Enter : 4.注释代码:Ctrl + K --> ...