PAT 甲级 1001
参考自:https://blog.csdn.net/richenyunqi/article/details/84981078
题目描述
首先,题目给定了a,b的取值范围,对于输入数据要用空格将输入的a,b隔开,对于输出的结果需要用逗号分开。
总体思路
输出的时候可以采取向前遍历和向后遍历两种方法。
向前遍历
算法设计
对于待输出的int变量转换为能求长度的string变量,并求长度len,如果len%3 = n> 0,输出前n个数字并且按照“,xxx”的格式依次输出。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b; //读入a,b
if(a+b<0) //判断是否为负数
cout<<"-";
string s=to_string(abs(a+b)); //将|a+b|的结果用字符串表示便于遍历
int i=s.size()%3==0?3:s.size()%3; //如果长度被3整除则i=3,否则i=长度被3除的到的余数
cout<<s.substr(0,i); //从第0位开始的长度为i的字符串,默认时的长度为从开始位置到尾
for(;i<s.size();i+=3)
cout<<","<<s.substr(i,3);
return 0;
}
向后遍历
长度依旧用len表示,n = len%3,如果len>3,先输出3个,继续比较 len-3和n的大小。如果len<3,直接输出n个。
这里选择用向量来实现,从字符串最左边开始每数3个元素储存到向量的一个单元中,直到不足3个,然后倒序输出向量元素。
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[]){
int a,b;
cin>>a>>b;
if(a+b<0)
cout<<"-";
string s=to_string(abs(a+b));
vector<string>v; //定义向量,用于储存string的每3位数字
for(int i=s.size();i>0;i-=3) //从后向前遍历
v.push_back(i>=3?s.substr(i-3,3):s.substr(0,i)); //将数字储存到向量的分块中,比如:s=1,234,567,v[0] = 567,v[1] = 234, v[2] = 1
for(int i=v.size()-1;i>=0;--i)// 倒序将向量块输出
printf("%s%s",v[i].c_str(),i>0?",":"");
}