PAT乙1006.换个格式输出整数

题目

让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。

输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。

输出格式:每个测试用例的输出占一行,用规定的格式输出n。

输入样例1:
234
输出样例1:
BBSSS1234
输入样例2:
23
输出样例2:
SS123

思考

题目很简单,然而我的做法再次的有些繁杂。因为题目不会超过3位,所以直接通过三个短式子就可以算出各个位上的数字了,而不需要使用while循环。

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <sstream>
using namespace std;

int main(){
int n;
cin >> n;
int cnt = 0;
string result = "";
while(n / 10 != 0){
cnt ++;
int temp = n % 10;
n /= 10;
if(cnt == 1){
if(temp == 0) continue;
else{
for(int i=1; i<=temp; i++){
string re;
stringstream ss;
ss << i;
ss >> re;
result = result + re;
}
}
}
if(cnt == 2){
if(temp == 0);
else{
for(int i=1; i<=temp; i++){
result = "S"+result;
}
}
}
}
if(cnt == 0){
for(int i=1; i<=n; i++){
string re;
stringstream ss;
ss << i;
ss >> re;
result = result + re;
}
}
else if(cnt == 1){
for(int i=1; i<=n; i++){
result = "S"+result;
}
}
else{
for(int i=1; i<=n; i++){
result = "B"+result;
}
}
cout << result << endl;
}

另外,这里有两个地方需要记住:
(1)与之前的一道题类似,如果输入的是个位数,那么就不会进入while循环,则cnt为0,因此需要额外判断;
(2)数字转字符串通用做法,要记住:

#include <sstream>
for(int i=1; i<=n; i++){
    string re;
    stringstream ss;
    ss << i;
    ss >> re;
    result = result + re;
}

这里贴一下别人的简单做法,本该想到的。。。

#include<stdio.h>
int main()
{
    int N;
    int num[3] = {0};
    int i = 0;
    int tmp = 0;
    scanf("%d", &N);
    num[2] = N/100; //就是这里,明显地可以简化的,我傻了。
    num[1] = N%100/10;
    num[0] = N%10;

    for(tmp = num[2]; tmp > 0; tmp--){
        printf("B");
    }
    for(tmp = num[1]; tmp > 0; tmp--){
        printf("S");
    }
    for(tmp = 0; tmp < num[0]; tmp++){
        printf("%d", tmp+1);
    }
    printf("\n");
    return 0;
}