
这类题目几乎不需要数据结构,算法基础,主要通过简单的逻辑流程和判断实现。
给出两个整数a和b,a和b的取值范围为[-1000000,1000000],然后计算a和b的和,并且输出a和b的和,但是输出的时候不能直接输出,而需要转换成标准格式,所谓标准格式,即每三位数字之后加一个“,”,数字最后不用加“,”。
定义两个整形变量a和b,因为int型的取值范围大致为±2^32,要大于所给所给的取值范围。直接进行加法计算,得到结果。但这时所得的结果的格式不满足要求,要想满足要求,需要将所得的整数转换成字符串,然后对字符串进行操作,即在所得字符串的相应位置加入“,”即可。
这是我做的第一道PAT甲级题,有点没有适应。
warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]在PAT上写C代码的时候出现 warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
原因:使用 scanf的时候有一个返回值
a.c: In function ‘main’:
a.c:5:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&n);
^~~~~~~~~~~~~~
PAT 独有的错误,其他的 OJ 从来没有遇到过。
#include
int main() {
int a;
scanf("%d", &a);
printf("%d", a);
return 0;
}
解决:编写代码的时候给 scanf一个返回值即可
#include
int main() {
int a;
if(scanf("%d", &a)){
printf("%d", a);
}else{
printf("error");
}
return 0;
}
奇奇怪怪的错误
#include
#include
#include
using namespace std;
long long a,b,c;
stack<int>d;
int main() {
cin>>a>>b;
c=a+b;
if(c==0) {
cout<<"0"<<endl;
} else {
int k;
while(!d.empty()) {
d.pop();
}
if(c<0) {
cout<<"-";
c=-1*c;
}
while(c>0) {
k=c%10;
d.push(k);
c=c/10;
}
while(!d.empty()) {
if(d.size()==1) {
k=d.top();
d.pop();
cout<<k;
}
k=d.top();
d.pop();
cout<<k<<",";
}
cout<<endl;
}
return 0;
}
段错误

如果出现段错误一般是以下情况:
当然,我的这个代码的问题,在于 size()函数。
size()函数原因是 size()函数返回的是无符号型的数,当 a 为空时,此时二进制数值大小不是 -1,而是被当做无符号整型处理,
00000000
H
(
真值为
0
)
+
11111111
H
=
2
32
−
1
0000 0000H(真值为0) + 1111 1111H = 2^{32} - 1
00000000H(真值为0)+11111111H=232−1 。必然发生错误。
解决办法是写成 i + 1 < a . s i z e ( ) i + 1 < a.size() i+1<a.size(),或者 i < ( i n t ) a . s i z e ( ) − 1 i < (int) a.size() - 1 i<(int)a.size()−1 即可。
%1000的问题#include
#include
#include
using namespace std;
long long a,b,c,d[100000];
int main() {
cin>>a>>b;
c=a+b;
if(c==0) {
cout<<"0"<<endl;
} else {
long long k=0,ans=0;
if(c<0) {
cout<<"-";
c=-1*c;
}
while(c>0) {
k=c%1000;
d[ans++]=k;
c=c/1000;
}
for(long long i=ans-1; i>0; i--) {
cout<<d[i]<<",";
}
cout<<d[0]<<endl;
}
return 0;
}
结果 15 分,想了半天为什么。

通过白盒测试的思路,寻找答案
输入: 1 999
输出: 1,0
#include
#include
#include
#include
using namespace std;
long long a,b,c,d[100000];
int main() {
cin>>a>>b;
c=a+b;
if(c==0) {
cout<<"0"<<endl;
} else {
long long k=0,ans=0;
if(c<0) {
cout<<"-";
c=-1*c;
}
while(c>0) {
k=c%1000;
d[ans++]=k;
c=c/1000;
}
if(ans==1) {
cout<<d[ans-1];
} else {
cout<<d[ans-1]<<",";
for(long long i=ans-2; i>0; i--) {
cout<<setfill('0')<<setw(3)<<d[i]<<",";
}
cout<<setfill('0')<<setw(3)<<d[0]<<endl;
}
}
return 0;
}
这个也AC了
#include
#include
#include
using namespace std;
long long a,b,c,d[100000];
int main() {
cin>>a>>b;
c=a+b;
if(c==0) {
cout<<"0"<<endl;
} else {
long long k=0,ans=0;
if(c<0) {
cout<<"-";
c=-1*c;
}
while(c>0) {
k=c%10;
d[ans++]=k;
c=c/10;
}
for(long long i=ans-1; i>=0; i--) {
cout<<d[i];
if(i>0&&i%3==0)
cout<<",";
}
}
return 0;
}