• 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);
      ^~~~~~~~~~~~~~
    
    • 1
    • 2
    • 3
    • 4

    PAT 独有的错误,其他的 OJ 从来没有遇到过。

    #include 
    
    int main() {
        int a;
        scanf("%d", &a);
        printf("%d", a);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    #include 
     
    int main() {
        int a;
        if(scanf("%d", &a)){   
            printf("%d", a);
        }else{
            printf("error");
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.2 段错误

    奇奇怪怪的错误

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    段错误

    在这里插入图片描述

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

    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=2321 。必然发生错误。

    解决办法是写成 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 即可。

    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"<<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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    结果 15 分,想了半天为什么。

    在这里插入图片描述

    通过白盒测试的思路,寻找答案

    输入: 1 999
    输出: 1,0
    
    • 1
    • 2

    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"<<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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    这个也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"<<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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    springboot整合kettle和xxljob
    【matplotlib基础】--动画
    nacos基础概念和单机启动
    【无标题】
    安装Redis
    自动化工具
    一次调整prompt的过程
    视频转gif的几个方法
    案例解读【淘宝API接口的运用:抓取用户数据从而驱动精准营销
    python在nacos注册微服务
  • 原文地址:https://blog.csdn.net/qq_46371399/article/details/126256718