PAT甲级1001 A+B Format 【20分】【C语言实现】【字符串操作】

备战2020冬季甲级PAT考试。

1001 A+B Format (20分)

Calculate a+b and output the sum in standard format – that is, the digits must be separated into groups of three by commas (unless there are less than four digits).

计算 a+b 的值,并以标准形式输出它们的总和——意思就是说,每三个数位必须用逗号分隔开(除非一共就只有四位数)

Input Specification:

Each input file contains one test case. Each case contains a pair of integers a and b where −10​e6​​≤a,b≤10e​6​​. The numbers are separated by a space.

输入规范:
每个输入文件都包含一个测试样例,每个例子包含一对整数 a 和 b ,它们的取值范围是−10​e6​​≤a,b≤10e​6。两个整数之间用一个空格分隔。

Output Specification:

For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.

输出规范:
每个测试样例中,必须将a和b的总和输出到一行里。总和必须用标准输出形式输出。

输入输出样例:

在这里插入图片描述

第一次代码实现

这种实现方式非常笨重,而且没法AC;请教了朋友之后,他推荐给我柳神(柳婼)的笔记——

扫描二维码关注公众号,回复: 11936877 查看本文章

看了人家的代码才知道我差得远了!
我的问题根本不是怎么调AC,而是一开始思路就不对——做PAT题目的核心目的是练习算法,练习思维,而非机械输出以求快速找到样例答案!

#include <stdio.h>

int main()
{
    
    
	int a;
	int b;
	//用户输入a 和b的值
	scanf("%d %d",&a,&b);
	
	//计算a+b的值 
	int sum=a+b;
	
	//判断结果是否为负数,如果为负,取绝对值
	if(sum<0)
	{
    
    
		printf("-");
		sum = -sum;
	 } 
	
	//如果结果为零,直接输出
	if(sum==0)
	{
    
    
		printf("0");
		return 0;
	 } 
	
	//将和转换成字符串
	//首先分离数位
	char s[100];
	int i=0;
	while(sum!=0)
	{
    
    
		s[i] = '0'+sum %10; //将数字转换为字符的方式 
		sum = sum /10;
		i++;
	}
	 //i为数位个数 
	 
	 //将字符串逆序
	int j;
	for(j=0;j<i/2;j++)
	{
    
    
		char temp;
		temp=s[j];
		s[j]=s[i-1-j];
		s[i-1-j]=temp;
	}
	
	//向字符串中填入逗号
	int count=0;
	for(j=i-1;j>=0;j--)
	{
    
    
		count++;
		//从后向前,满三位就填入一个逗号 
		if((count==3)&&(j!=0))
		{
    
    
			int k;
			for(k=i;k>j;k--)
			{
    
    
				s[k]=s[k-1];//从后向前覆盖 
			}
			s[k]=',';//插入逗号 
			count=0;//开始重新计数 
		}
	 } 
	 
	//输出字符串
	for(j=0;j<=i;j++)
	{
    
    
		printf("%c",s[j]);
	}
	
	return 0;
 } 
 

第二次代码实现(参考柳神笔记)

这次就要简洁多了——思路正确是基本不会错太远的。
努力做正确的事,而不仅仅是努力。

#include <stdio.h>

int main()
{
    
    
	int a;
	int b;
	//用户输入a 和b的值
	scanf("%d %d",&a,&b);
	
	//计算a+b的值 
	int sum=a+b;
	
	//判断结果是否为负数,如果为负,取绝对值
	if(sum<0)
	{
    
    
		printf("-");
		sum = -sum;
	 } 
	
	//如果结果为零,直接输出
	if(sum==0)
	{
    
    
		printf("0");
		return 0;
	 } 
	
	//将和转换成字符串
	//首先分离数位
	char s[100];
	int i=0;
	while(sum!=0)
	{
    
    
		s[i] = '0'+sum %10; //将数字转换为字符的方式 
		sum = sum /10;
		i++;
	}
	 //i为数位个数 
	 
	 //将字符串逆序
	int j;
	for(j=0;j<i/2;j++)
	{
    
    
		char temp;
		temp=s[j];
		s[j]=s[i-1-j];
		s[i-1-j]=temp;
	}
	
	//printf("\n%s\n",s);
	//输出字符串并填入逗号
	for(j=0;j<i+1;j++)
	{
    
    
		if(((i+1)%3==(j+1)%3)&&(j!=0)&&(j!=i))
			printf(",");
		printf("%c",s[j]);
	 } 
	 
	
	
	return 0;
 } 
 

运行结果

在这里插入图片描述

总结

1)需要考虑的特殊情况:

①如果结果为负数,需要单独输出负号;
②第一位前面不要输出逗号;
③和为零的情况需要单独输出,因为存不进字符串;

2)还是用C++吧!!!封装库它不香吗?!! 看看人家柳神的代码,直接一个to_string ,等于我的 分离数位+存为字符串+字符串逆序

#include <iostream>
using namespace std;
int main() {
    
    
    int a, b;
    cin >> a >> b;
    string s = to_string(a + b);
    int len = s.length();
    for (int i = 0; i < len; i++) {
    
    
        cout << s[i];
        if (s[i] == '-') continue;
        if ((i + 1) % 3 == len % 3 && i != len - 1) cout << ",";
    }
    return 0;
}

C++语法笔记

to_string() 转化为字符串:
string s = to_string(a+b);

统计字符串长度:
int len = s.length();

生词

word translate
output in standard format 以标准形式输出
be separated into groups 被分离为组
commas 逗号

猜你喜欢

转载自blog.csdn.net/Cambridge26/article/details/108921621