关于算法-数据结构:PAT甲级1001-AB-Format

23次阅读

共计 1210 个字符,预计需要花费 4 分钟才能阅读完成。

题目粗心:

给出两个整数 a,b, 求 a + b 的值,并依照每三位用一个逗号分隔分模式输入。

算法思路:

这里给出 2 种解题思路,第一种是通用的解法,对于任意整数都实用。第二种是利用此题的数据范畴来解题。

第一种办法:

首先计算 a + b 的值 c,对于正数先输入负号,而后对后果取绝对值,应用 string r 存储最初输入的后果,将 c 的每一位逆序增加到 r 中,并且每增加 3 位就增加一个逗号 (应用 index 来标记增加位数),这里得特判 c == 0 的状况,间接输入 0,最初将 r 逆序输入即可。

第二种办法:

仔细分析下就能够晓得,最大后果为 -210^6 和 2 10^6,也就是最多只有 7 位数字局部,那么最多就 2 个中央可能须要增加逗号如:1,000,000 首先将数字 c 取绝对值而后转化为 string 类型,用 string s 保留, 而后将 s 逆置, 判断是否有 7 位,如果 abs(c)>999999 的话,就阐明得增加 2 个逗号, 如果 abs(c)>999 的话阐明增加 1 个逗号,否则不增加,每隔三位增加一个逗号。

提交后果:
 第一次测试:测试点 4 谬误, 起因在于没有判断 a + b 等于 0 的状况 

AC 代码:
第一种办法:
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    int c = a+b;
    if(c<0){printf("-");
        c = -c;
    }
    if (c==0){printf("0");
        return 0;
    }
    string r;
    int index = 0;
    while (c!=0){if(index%3==0&&index!=0){
            // 这里得排除初始 index= 0 的状况
            r += ",";
        }
        r += to_string(c%10);
        c /= 10;
        ++index;
    }
    reverse(r.begin(),r.end());
    printf("%s",r.c_str());
    return 0;
}
第二种办法:
#include<string>
#include<iostream>
#include<algorithm>

using namespace std;

int main(){
    int a,b;
    cin>>a>>b;
    int c = a+b;
    int d = abs(c);
    string s = to_string(d);
    string result = "";
    if(c<0) cout<<"-";
    reverse(s.begin(),s.end());
    if(d>999999){result += s.substr(0,3)+","+s.substr(3,3)+","+s.substr(6); 
    }else if(d>999){result += s.substr(0,3)+","+s.substr(3); 
    }else{result += s;}
    reverse(result.begin(),result.end());
    cout<<result;
}

正文完
 0