当前位置:网站首页>1001 A+B Format(字符串处理)

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

2022-08-10 16:12:00 老顽固也可爱

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 <stdio.h>

int main() {
    
    int a;
    scanf("%d", &a);
    printf("%d", a);
    return 0;
}

解决:编写代码的时候给 scanf一个返回值即可

#include <stdio.h>
 
int main() {
    
    int a;
    if(scanf("%d", &a)){
       
        printf("%d", a);
    }else{
    
        printf("error");
    }
    return 0;
}

3.2 段错误

奇奇怪怪的错误

#include<iostream>
#include<cstdio>
#include<stack>
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;
}

段错误

在这里插入图片描述

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

  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,而是被当做无符号整型处理,$ 0000 0000H(真值为0) + 1111 1111H = 2^{32} - 1$ 。必然发生错误。

解决办法是写成 $ i + 1 < a.size()$,或者 i < ( i n t ) a . s i z e ( ) − 1 i < (int) a.size() - 1 i<(int)a.size()1 即可。

3.3 %1000的问题

#include<iostream>
#include<cstdio>
#include<stack>
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<iostream>
#include<cstdio>
#include<stack>
#include<iomanip>
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了

3.4 AC 代码

#include<iostream>
#include<cstdio>
#include<stack>
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;
}
原网站

版权声明
本文为[老顽固也可爱]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_46371399/article/details/126256718