这类题目几乎不需要数据结构,算法基础,主要通过简单的逻辑流程和判断实现。
大致题意:
给出两个整数a和b,a和b的取值范围为[-1000000,1000000],然后计算a和b的和,并且输出a和b的和,但是输出的时候不能直接输出,而需要转换成标准格式,所谓标准格式,即每三位数字之后加一个“,”,数字最后不用加“,”。
基本思路:
定义两个整形变量a和b,因为int型的取值范围大致为±2^32,要大于所给所给的取值范围。直接进行加法计算,得到结果。但这时所得的结果的格式不满足要求,要想满足要求,需要将所得的整数转换成字符串,然后对字符串进行操作,即在所得字符串的相应位置加入“,”即可。
一些细节:
首先将所得整数结果转换成字符数组。
刚开始所用的方法是_itoa_s(int,char[],进制);该方法共有三个参数,第一个参数是想要转换的整形数字,第二个参数是,接收转换结果的字符数组,第三个参数是以哪种进制进行转换。但是这个函数在官方编译器中不能通过编译。
后来选用snprintf(char[],sizeof(char),"%d",int)函数;该函数共有四个参数,第一个为接收结果的字符数组,第二个为数组的长度,"%d"指定整数类型,x为需要进行转换的整数。
除了使用snprintf()的方法,还可以使用C++的类型转换 string str=to_string(int)
;直接将整数类型转换成字符串;将字符串转化为整数可以用:atoi(str.c_str())
得到字符型数组后,将字符数组转换为string类型,直接 string str=ch;就可以。使用string类型的丰富多样的方法和操作很容易对字符串进行操作。
最后的提交结果,有一些测试点答案不正确,20分的题,只拿到了14分,冥思苦想,也没能想到遗漏了哪些测试点。
提交的代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
int sum;
sum=a+b;
char ch[10];
snprintf(ch, sizeof(ch), "%d", sum);
string str=ch;
string temp=",";
if(sum<0) //首先判断结果是否为负数
{
if(str.size()<=4) //如果是负数,并且字符串的长度小于等于4,
//这时候不需要处理,直接输出就好
cout<<str<<endl;
else if(str.size()>4&&str.size()<=7) //需要加入一个逗号的情况
{
str.insert(str.begin()+4,temp.begin(),temp.end());
cout<<str<<endl;
}
else{ //需要插入两个逗号的情况
str.insert(str.begin()+4,temp.begin(),temp.end());
str.insert(str.begin()+8,temp.begin(),temp.end());
cout<<str<<endl;
}
}
else
{
if(str.size()<=3)
cout<<str<<endl;
else if(str.size()>3&&str.size()<=6)
{
str.insert(str.begin()+3,temp.begin(),temp.end());
cout<<str<<endl;
}
else{
str.insert(str.begin()+3,temp.begin(),temp.end());
str.insert(str.begin()+7,temp.begin(),temp.end());
cout<<str<<endl;
}
}
return 0;
}
出错原因:
读题不认真,题意理解出错,应该从右边开始,每三位加入一个逗号;
修改过后,结果正确。(采用了暴力的方法,此处代码极不优美,没有参考意义,就不贴上了)
此时在浙大PAT的排名为40737