有些意思的C/C++编程题

1. 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值。

不知道怎么解释,是个很巧妙的方法,观察观察自己理解吧:

#include <iostream>

using namespace std;

int main() {
    int a, b, c, temp;
    b = 0;
    cin >> a;
    c = a; // a的复制
    while (a) {
        temp = a % 10; // 余数
        b = b * 10 + temp;
        a = a / 10;
    }
    if (b == c) {
        cout << "yes" << endl;
    } else {
        cout << "no" << endl;
    }
}

2. 某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法?

解题思路: 穷举法,没啥好说的。
优化方式: 减少穷举次数:要每种钞票最少一张,所以 10 元钞票最多只能有 9 张;同理,5 元钞票最多只能有 19 张,2 元的和 1 元的最多只能有 37 张。

#include <iostream>

using namespace std;

// 穷举法思想
int main() {
    int a, b, c, d,total = 0;
    for (a = 1; a <= 9; a++) {
        for (b = 1; b <= 19; b++) {
            for (c = 1; c <= 37; c++) {
                for (d = 1; d <= 37; d++) {
                    if (a * 10 + b * 5 + c * 2 + d == 100 &&
                        a + b + c + d == 40) {
                        total++;
                    }
                }
            }
        }
    }
    cout << total << endl;
}

3. 读取一个字符串,字符串可能含有空格,将字符串逆转,原来的字符串与逆转后字符串相同,输出0,原字符串小于逆转后字符串输出-1,大于逆转后字符串输出1。例如输入 hello,逆转后的字符串为 olleh,因为hello 小于 olleh,所以输出-1。

解题思路: 数组逆置,通过 strcmp() 判断两组字符串的大小。
需要说明的是,C++ 编译器已不支持 gets(),在 C++ 中,对字符数组的赋值,使用 cin.getline(字符数组名, 字符数组长度),若使用 C 语言,则还需要在逆置数组后再设置结束符 ‘\0’。

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main() {
    char s[100];
    cin.getline(s, 100, '\0');  // 字符数组名称,字符数组大小,结束符(不写则默认)
    // gets(s); // C语言用法,C++编译器已不支持gets()
    int len = strlen(s);

    char v[100]; // 逆置数组

    for (int i = len - 1, j = 0; i >= 0; i--, j++) {
        v[j] = s[i];
    }

    // v[j] = '\0'; // C语言情况下,需要另设置字符串结束符

    int result = strcmp(s, v);

    if (result < 0) {
        cout << -1 << endl;
    } else if (result > 0) {
        cout << 1 << endl;
    } else {
        cout << 0 << endl;
    }
}

4. 输入一个整型数,然后申请对应大小空间内存,然后读取一个字符串,字符串的输入长度小于最初输入的整型数大小,最后输出输入的字符串即可(无需考虑输入的字符串过长,超过了内存大小)。

#include <iostream>

using namespace std;

int main() {
    int n;
    char c;
    char *p;
    cin >> n;
    p = (char *)malloc(n);
    scanf("%c", &c);   // 去除缓冲区的换行符
    cin.getline(p, n); // C语言使用 gets(p) ,可以达成同样的效果
    cout << p << endl; // 输出字符数量为 int - 1 ,因为字符串类型的结尾需要一个 '\0' 结束符
}

5. 假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为便于读者理解题意,这里举例说明如下:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。输入为n,输出为走到第n个台阶有几种走法。

解题思路: 第 n 级台阶只可能从 n - 1 或 n - 2 级台阶上来, n - 1 台阶只可能从 n - 2 或 n - 3 级台阶上来,以此类推,可以发现这是一个递归,递归的结束条件就是 n = 1 或 n = 2 ,因为当n = 1 或 2时步数是确定的,递推回去就可以计算出总共的步数。

#include <iostream>

using namespace std;

int step(int n) {
    if (n == 1 || n == 2) {
        return n;
    } else {
        return step(n - 1) + step(n - 2);
    }
}

int main() {
    int n,sum;
    cin >> n;
    sum = step(n);
    cout << sum << endl;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值