PTA刷题Advanced甲级——1001.A+B Format——Day(1)

开篇

历时42天终于刷完了PTA乙级的所有题目,所以对于只想考乙级证的兄弟们,不要慌,一天两道题绝对很快就搞定了,40天就可以刷完所有题目而且可以轻松应付考试。
但对于浙江大学来说,真正可以代替机试的只有甲级考试,所以我们还是要继续坚持两个月左右,把甲级115道题全部刷完,一起加油互相监督。

问题描述

在这里插入图片描述
将给定的两个数字相加,并要输出为一种特殊的形式,即从后往前,每三个数字就会使用一个逗号分隔开。

题目分析

题目比较简单吧,但是有几个坑点:
1.我们将两数字单纯相加,不用担心,不会溢出,然后将数字转化成字符串形式。在这里说明一下,大家常用的itoa在PTA中是不合法的,即使在自己的编译环境下可以通过,但是在PTA上会编译报错。所以我们使用的是另一种将数组转换为字符数组的函数snprintf.
2.如图两数相加为负数,则字符数组第一个位置是’-’,所以我们真正找数字的时候应该跳过这个字符。
首先先计算出数字的长度,遍历我们的字符数组,如果开头为’-'则跳过。如果当前字符是一个数字我们就将长度+1.最后算出长度,长度的作用主要是为了方便我们从后往前遍历字符数组,因为我们要保证每三个数字中间有一个逗号。
从后向前遍历数组,将每个字符加入一个vector容器中,每加入三个再额外添加一个",",最后将vector反转输出即可。

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
using namespace std;
int main()
{
    int a,b;//字符串形式输入两个数字
    cin>>a>>b;
    int res = a+b;
    char s[25];
    vector<char>ans;
    snprintf(s, sizeof(s), "%d", res);
    int j = (s[0] == '-') ? 1 : 0;
    while(isdigit(s[j]))
    {
        j++;
    }
    int count = 0;
    for(int i = j - 1;i>=0;i--)
    {
        if(count % 3 == 0 && count >= 3 && isdigit(s[i]))
        {
            ans.push_back(',');
            ans.push_back(s[i]);
        }
        else
            ans.push_back(s[i]);
        count++;
    }
    reverse(ans.begin(),ans.end());
    for(int i = 0;i < ans.size();i++)
        cout<<ans[i];
    return 0;
}

答题用时13min
Q1——finish√

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值