PAT乙级 1002 写出这个数

最近在刷PAT乙级题目,觉得这个第二题有点意思就写篇文章记录一下,也算是复习了,同时也能帮助没有思路的朋友们理清思路。
在这里插入图片描述
一上来,我想大部分人直接就写出的int n;这一步了,好像肌肉记忆。用int表示整数好像已经成为了我们的思维定式。可我们看这道题,n是自然数,虽然符合正整数,但是它的最大到10的100次方-1。有没有想到一个问题,范围超出了!
32位系统中int占四个字节,范围是-2147483648~2147483647。10的100次方有101位数,远超int的范围,而long long呢?不用想肯定也不行,101位数可以说是天文数字了。那怎么办呢?我们可以用字符串啊!字符串可以有很多位,用字符串表示数字就完美解决了这个问题。

C++代码如下:

#include<iostream>
#include<string>
using namespace std;
void printchinese(int a);
int main() {

    string n;
    cin >> n;
    int sum = 0;
    int s = 0;//标志位,避免出现结果前面为0;出现非零数后将标志位设置为1,输出后面的所有数字。
    for (int i = 0; i < n.length(); i++) {
        sum += n[i] - '0';//用每一位减去字符'0'得到的就是那一位的数字
    }
    for (int i = 100; i != 0; i /= 10) {
        if (sum / i != 0) s = 1;//出现非零数,将标志位设置为1.
        if (s == 1) {
            printchinese(sum / i);
            if (i != 1) cout << " ";
        }
        sum = sum - (sum / i) * i;
    }

    return 0;
}
void printchinese(int a) {
    switch (a) {
    case 0:
        cout << "ling"; break;
    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;
    }
}

注意:
sum += n[i] - ‘0’;可能有人对这一行不太清楚,这一行是字符和数字之间的转换,每一位字符减去字符’0’得到的就是那个字符对应的数字,比如字符’1’变成数字1。原理是什么呢?其实利用的是这些数字asc码的差值,比如字符1和字符0的asc码相差1,它们作差得到的就是数字1了,其他数字同理。

因为我是从最高位开始操作的,我先除以100(因为100位数字各个位上的和最大为900,是个三位数),如果是三位数,就得到了最高位的数。可如果是两位或者一位数呢?除以100就会得到0,甚至是连着两个0,我们总不能让最高位为0吧!所以我用s当做标志位,标志着什么呢?当sum/i得到非0数时,把标志位设置为1,代表着可以进行输出操作了,在标志位s变为1之前,说明sum/i得到的都是0,也就没有必要把0输出出来了。把得到的数作为参数传输到自己写的printchinese函数中,用switch语句,有匹配的数字就输出对应的汉语拼音。

我写完后也看了看别人的题解,让我有启发的是其实可以用二维数组表示这些汉语拼音 eg:char a[10][5]={ “ling”, “yi”, “er”, “san”, “si”,“wu”, “liu”, “qi”, “ba”, “jiu” };用sprintf(sumStr, “%d”, sum);把sum转换成字符串sumStr。用strlen函数得到该字符串的长度,用一个循环遍历该字符串,输出a中每一位对应的数(记得还要用-‘0’)

**最坑的一点:**题目说最后一个数后面没有空格,一开始我输出的就有空格,找了半天最没发现错误所在,所以说认真读题真的很重要,拿到一道题不要光咔咔咔一顿乱敲。

希望这篇文章有帮助到大家,哪里有不好的地方也欢迎大家指出,谢谢大家!

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一心只想AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值