这类题目几乎不需要数据结构,算法基础,主要通过简单的逻辑流程和判断实现。
1、大致题意给出两个整数a和b,a和b的取值范围为[-1000000,1000000],然后计算a和b的和,并且输出a和b的和,但是输出的时候不能直接输出,而需要转换成标准格式,所谓标准格式,即每三位数字之后加一个“,”,数字最后不用加“,”。
2、基本思路:定义两个整形变量a和b,因为int型的取值范围大致为±2^32,要大于所给所给的取值范围。直接进行加法计算,得到结果。但这时所得的结果的格式不满足要求,要想满足要求,需要将所得的整数转换成字符串,然后对字符串进行操作,即在所得字符串的相应位置加入“,”即可。
3、解题过程这是我做的第一道PAT甲级题,有点没有适应。
3.1 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 从来没有遇到过。
#includeint main() { int a; scanf("%d", &a); printf("%d", a); return 0; }
解决:编写代码的时候给 scanf一个返回值即可
#include3.2 段错误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 d; int main() { cin>>a>>b; c=a+b; if(c==0) { cout<<"0"< 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< 段错误
如果出现段错误一般是以下情况:
- 数组越界(大概率):
- 检查一下数组大小是不是少写了个0(笔者以前就有过…),如果题目要求1000,建议写1010
- 检查循环遍历的过程中,是否有个别下标越界的情况。
- sort函数里cmp比较函数必须要有返回值,比如只有一个return,不要在前面再写个if语句画蛇添足了
- 如果数组比较大,一般来说>10000就算大,就请在main的外面声明该数组
- 对于char 数组,如果题目说字符不超过8,请声明成10+
- 在循环体里面写个printf查看下想看的中间结果,说不定就知道自己哪里写错了
- 堆栈溢出:
- 一般出现这种情况都是在递归程序里面,比如DFS遍历树或图的时候,可以在递归里面写个printf查看下想看的中间结果,说不定就知道自己哪里写错了
当然,我的这个代码的问题,在于 size()函数。
3.2.1 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
3.3 %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"< 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< 结果 15 分,想了半天为什么。
通过白盒测试的思路,寻找答案
输入: 1 999 输出: 1,03.4 AC 代码1#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"< 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< cout< 0; i--) { cout< 这个也AC了
3.5 AC 代码2#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"< 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< 0&&i%3==0) cout<<","; } } return 0; }



