栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

1001 A+B Format(字符串处理)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1001 A+B Format(字符串处理)

1001 A+B Format(字符串处理)

这类题目几乎不需要数据结构,算法基础,主要通过简单的逻辑流程和判断实现。

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 从来没有遇到过。

#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;
}
3.2 段错误

奇奇怪怪的错误

#include
#include
#include
using namespace std;
long long a,b,c;
stackd;

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< 

段错误

如果出现段错误一般是以下情况:

  1. 数组越界(大概率):
    1. 检查一下数组大小是不是少写了个0(笔者以前就有过…),如果题目要求1000,建议写1010
    2. 检查循环遍历的过程中,是否有个别下标越界的情况。
    3. sort函数里cmp比较函数必须要有返回值,比如只有一个return,不要在前面再写个if语句画蛇添足了
    4. 如果数组比较大,一般来说>10000就算大,就请在main的外面声明该数组
    5. 对于char 数组,如果题目说字符不超过8,请声明成10+
    6. 在循环体里面写个printf查看下想看的中间结果,说不定就知道自己哪里写错了
  2. 堆栈溢出:
    1. 一般出现这种情况都是在递归程序里面,比如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,0
3.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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1039848.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号