• 【PAT甲级】1001 A+B Format


    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).

    Input Specification:

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

    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.

    Sample Input:

    -1000000 9
    

    Sample Output:

    -999,991
    


    思路

    • 不能直接从前往后遍历结果c的各位数字将其一个一个输出,因为考虑输出逗号需要从后往前计算数字个数。

    • 思路:

      设置一个存放最终输出结果的字符串。从后往前遍历各位数字,每次将其插在结果字符串的开头。同时计算已经遍历数字的个数,若个数是3的倍数,且当前遍历的数字不是第一位数字,则插入逗号。



    代码

    #include<iostream>
    #include<string>
    #include<math.h>
    
    using namespace std;
    
    int main() {
    
    	int a;
    	int b;
    	cin>>a;
    	cin>>b;
    
    	int c=a+b;
    	string cString=to_string(c);//int转string
    	string resultStr="";//输出结果字符串
    
    	int count=0;//已遍历数字的个数
    //插逗号时,从后往前 遍历数字;一边遍历一边赋值给另一个字符串
    	int i;//下标
    	if(c==0)
    		i=0;
    	else if(c<0) //c为负数,加一个符号位
    		i=(1+(int)log10(abs(c)))+1-1;
    	else
    		i=(1+(int)log10(abs(c)))-1;
    		
    	for(; i>=0; i--) {
    		string insertStr(1,cString.at(i));//char转为string
    
    		resultStr.insert(0,insertStr);
    		count++;
    		if(count%3==0) {
    			if(i==0||cString.at(i-1)=='-') { //不能插逗号:i指向元素是第一位数字;i指向元素前面一位为负号
    			} else {
    				resultStr.insert(0,",");
    			}
    		}
    	}
    
    	cout<<resultStr;
    	return 0;
    }
    


    知识点

    • string::at()返回值为char&类型

    • string::insert(下标i,字符串) //字符串插在字符串的下标i后

    • 计算c的位数,c不能为0

      1+(int)log10(abs(c))
      
    • 数据类型转换

      • string::to_string(c)//int转string

      字符串是从第一个字符开始存的: (c=-999,991)cString.at(0)是-

      • string::insertStr(1,cString.at(i)) //char转为string


    BUG

    1+(int)log10(abs(c))不能计算c=0的情况,需要另外处理


    解决:

    	if(c==0)
    		i=0;
    	else if(c<0) //c为负数,加一个符号位
    		i=(1+(int)log10(abs(c)))+1-1;
    	else
    		i=(1+(int)log10(abs(c)))-1;
    

    注意

    1. 当已遍历数字个数是3的倍数,但不能插逗号的情况:

      当前遍历的数字已经是数字串的首个数字:

      • 数字串是正数:当前遍历的数字是第一位(i==0)

      • 数字串是负数:前一位是符号‘ - ’

    		if(count%3==0) {
    			if(i==0||cString.at(i-1)=='-') { //不能插逗号:i指向元素是第一位数字;i指向元素前面一位为负号
    			} else {
    				resultStr.insert(0,",");
    			}
    		}
    


    单词

    comma:逗号

  • 相关阅读:
    Silver Cow Party
    vue+cli3多页面配置(附带axios拦截器)以及链接跳转传参
    jsp根据表单填写内容追加生成json
    Mobiscroll插件-根据时间选择弹出星座
    javascript sdk – 如何注销我使用OAuth2通过Google登录的应用程序?
    解决React Native安装应用到真机(红米3S)报Execution failed for task ':app:installDebug'的错误
    解决React Native安装应用到真机(红米手机)报Execution failed for task ':app:installDebug'的错误
    windows RN 环境搭建(实测心得)
    windows RN 环境搭建(实测心得)
    facebook 推特. Line 领英 分享功能 带图标(最全,实测可用)
  • 原文地址:https://www.cnblogs.com/musecho/p/12229427.html
Copyright © 2020-2023  润新知