【深入浅出程序设计竞赛】:字母转换、数字反转

187 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情

字母转换

输入一个小写字母,输出其对应的大写字母。例如输入 q ,会输出 Q

代码如下:

#include<iostream>
using namespace std;

int main() {
    char ch, ans;
    cin >> ch;
    ans = ch - 'a' + 'A';
    cout << ans;
    return 0;
}

运行结果:

q
Q

记录:

上述代码可以理解为:将 ch 的 ASCII 数字减去 a 的 ASCII 数字,此时得到的就是 0250 - 25 的数字,该数字表示的是从 0 开始计算是第几个字母(比如 q 是第16个)。最后加上 A 的 ASCII 数字(也就是65),就可以得到 Q 的 ASCII 数字。

另外,由于每个大写字母和小写字母在 ASCII 表里头刚好相差 32,(小写字母的 ASCII 比较大),利用这个特点,我们也可以这样来编写代码:

#include<iostream>
using namespace std;

int main() {
    char ch, ans;
    cin >> ch;
    ans = ch - 32;
    cout << ans;
    return 0;
}

虽然 ans 实际上存储的是一个数字,但是毕竟是字符型变量,因此直接使用 cout 输出时还是会输出 ASCII 码对应的字符。

数字反转

输入一个不小于 100 且小于 1000,同时包括小数点后位的一个浮点数,例如 123.4,要求把这个数字翻转过来,变成 4.321 并输出。

  • 解法一:
  • 分离这个数字的所有位数
#include <iostream>
using namespace std;

int main() {
    double p;
    cin >> p;           // 输入数字 
    int q;
    q = int(p * 10);	// 将输入的数字变成一个四位整数 
    int a, b, c, d;	// 分离出来的 4 位数字 
    a = q / 1000;	// 千位 
    b = q / 100 % 10;	// 百位
    c = q / 10 % 10;	// 十位
    d = q % 10;		// 个位
    cout << d << "." << c << b << a << endl; 
    return 0;
}
  • 解法二:
  • 将输入视为 5 个字符,直接输出即可(一个 char 只能容纳一个字符)
#include <iostream>
using namespace std;

int main() {
    char a, b, c, dot, d;
    cin >> a >> b >> c >> dot >> d;
    cout << d << dot << c << b << a;
    return 0;
}
  • 解法三:
  • 使用 scanf()printf() 两个 C 语言风格的输入输出。
#include <cstdio>
using namespace std;

int main() {
    char a, b, c, d;
    scanf("%c%c%c.%c", &a, &b, &c, &d);
    printf("%c.%c%c%c", d, c, b, a);
    return 0;
}

在上述代码运行中:

  • 计算机期望读取到 “[一个字符][一个字符][一个字符].[一个字符]”这样格式的输入数据。
  • 当读到数据 123.4123.4 的时候,就会分析这个输入,并拆分成“[1][2][3].[4]”
  • 最后,再按照特定的格式进行输出,即 “[一个字符].[一个字符][一个字符][一个字符]”
  • 这里第一个占位符的数据 44d 来提供,然后输出一个 . ,接着 c、b、a 这三个变量的会依次放入到剩余的占位符中。
  • 最后将结果输出来,即 4.3214.321 ,注意输出变量时前面不需要添加 & 符号。