【C++代码之美】你不得不知道的经典代码

1.斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

如下代码是15阶的斐波那契数列:

代码如下:

#include <iostream>

using namespace std;

int main() {
    int arr[15]; // 定义一个长度为15的整型数组
    arr[0] = 1; // 数列的第一个数字为1
    arr[1] = 1; // 数列的第二个数字为1
    for (int i = 2; i < 15; i++) { // 从第三个数字开始计算
        arr[i] = arr[i - 2] + arr[i - 1]; // 数列中每个数字都是前两个数字之和
    }
    for (int i = 0; i < 15; i++) { // 输出数列中的每个数字
        cout << arr[i] << endl;
    }
    cout << endl; // 换行
    return 0;
}

输出结果:

在这里插入图片描述

2.水仙花数

题目:

打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

例如:

153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

代码如下:

#include <iostream> // 引入iostream库,用于输入输出

using namespace std; // 使用std命名空间

int main(int argc, const char *argv[]) // 主函数
{
    for(int i=1;i<10;i++){ // 循环i从1到9
        for (int j=0;j<10;j++){ // 循环j从0到9
            for (int k=0;k<10;k++){ // 循环k从0到9
                if(i*i*i+j*j*j+k*k*k==i*100+j*10+k) // 如果i的三次方加上j的三次方加上k的三次方等于i乘以100加上j乘以10加上k
                cout << i*100+j*10+k << endl; // 输出i乘以100加上j乘以10加上k,并换行
                
            }
 
        }
    }
    return 0; // 返回0,表示程序正常结束
}

输出结果:

在这里插入图片描述

3.杨辉三角

杨辉三角的每行行首与每行结尾的数都为1.而且,每个数等于其左上及其正上二数的和。
代码如下:

#include <iostream>
using namespace std;

int main() {
    int a[15][15] = {{0}}; // 定义一个15行15列的二维数组,初始化为0
    int i, j;
    for (i = 0; i < 15; i++) {
        a[i][0] = 1; // 每行第一个元素为1
        for (j = 1; j <= i; j++) {
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; // 其他元素为上一行相邻两个元素之和
        }
    }
    for (i = 0; i < 15; i++) {
        for (j = 0; j <= i; j++) {
            cout << a[i][j] << "    "; // 输出每个元素,占8个字符宽度
        }
        cout << endl; // 每行输出完毕后换行
    }
    return 0;
}

输出结果:

在这里插入图片描述

4.猴子吃桃

一只小猴子一天摘了许多桃子,第一天吃了一半,然后忍不住多吃了一个。第二天又吃了一半,再加上一个;后面每天都是这样吃.到第10天的时候,小猴子发现只有一个桃子了。
问小猴子第一天共摘了多少个桃子?
用递归函数求得小猴子第一天共摘了多少个桃子。

代码如下:

#include <iostream>
using namespace std;

int tao(int n); // 函数声明

int main() {
    cout << tao(10) << endl; // 输出数列的第10项
    return 0;
}

int tao(int n) {
    if (n == 1) { // 递归结束条件
        return 1;
    }
    return (tao(n - 1) + 1) * 2; // 递归调用,计算数列的第n项
}

函数tao是一个递归函数,它的参数是数列的项数n,返回值是数列的第n项。在函数内部,我们首先判断递归结束的条件,即当n等于1时,返回1。否则,我们递归调用tao(n - 1)来计算数列的第n-1项,然后加1并乘以2,得到数列的第n项。

输出结果:

在这里插入图片描述

5.编写一个持续刷新的时钟

代码如下:

#include <iostream>
#include<unistd.h>
using namespace std;

int main() {
    int year, month, day, hour, min, sec;
    cin >> year >> month >> day >> hour >> min >> sec; // 读入年月日时分秒

    while (1) {
        sleep(1); // 程序暂停1秒

        if (sec < 59) { // 秒数小于59,秒数加1
            sec++;
        } else if (min < 59) { // 秒数等于59,分钟数小于59,分钟数加1,秒数归零
            min++;
            sec = 0;
        } else if (hour < 23) { // 秒数等于59,分钟数等于59,小时数小于23,小时数加1,分钟数和秒数归零
            hour++;
            min = 0;
            sec = 0;
        } else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day < 31) { // 秒数等于59,分钟数等于59,小时数等于23,月份为31天的月份,日期小于31,日期加1,小时数、分钟数和秒数归零
            day++;
            hour = 0;
            min = 0;
            sec = 0;
        } else if (month == 2 && day < 28) { // 秒数等于59,分钟数等于59,小时数等于23,月份为2月,日期小于28,日期加1,小时数、分钟数和秒数归零
            day++;
            hour = 0;
            min = 0;
            sec = 0;
        } else if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) { // 秒数等于59,分钟数等于59,小时数等于23,月份为30天的月份,日期小于30,日期加1,小时数、分钟数和秒数归零
            day++;
            hour = 0;
            min = 0;
            sec = 0;
        } else if (month < 12) { // 秒数等于59,分钟数等于59,小时数等于23,日期为当月最后一天,月份小于12,月份加1,日期变为1号,小时数、分钟数和秒数归零
            month++;
            day = 1;
            hour = 0;
            min = 0;
            sec = 0;
        } else { // 秒数等于59,分钟数等于59,小时数等于23,日期为当月最后一天,月份等于12,年份加1,月份变为1月,日期变为1号,小时数、分钟数和秒数归零
            year++;
            month = 1;
            day = 1;
            hour = 0;
            min = 0;
            sec = 0;
        }

        // 输出当前时间,r表示不换行,而是回到行首
        printf("%02d:%02d:%02d:%02d:%02d:%02dr", year, month, day, hour, min, sec);
        fflush(stdout); // 刷新输出缓冲区
    }

    return 0;
}

输出结果:

在这里插入图片描述
输出当前的时间之后,代码就不断运行并持续刷新。。。

6.字符串中某个字符出现的次数

写一个函数有两个参数,第一个参数是个字符,第二个参数是个char *,
函数功能为返回这个字符串中该字符的个数。

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>

// 统计字符串中指定字符的个数
int func(char a, char *b) {
    int i = 0;
    while (*b) {
        if (a == *b) {
            i++;
        }
        b++;
    }
    return i;
}

int main() {
    char c;
    char s[30] = ""; // 初始化为全 0,等价于初始化为空字符串
    std::cout << "请输入一个字符:" << std::endl;
    std::cin >> c;
    std::cin.ignore(); // 忽略输入缓冲区中的换行符
    std::cout << "请输入一个字符串:" << std::endl;
    std::cin.getline(s, 30); // 使用 getline 函数读取一行字符串
    int count = func(c, s);
    std::cout << "字符 " << c << " 在字符串中出现了 " << count << " 次。" << std::endl;
    return 0;
}

输出结果:

在这里插入图片描述

7.字符串逆序输出

代码如下:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    cout << "Enter a string: ";
    getline(cin, str); // read input string
    cout << "Reverse string: ";
    for (int i = str.length() - 1; i >= 0; i--) {
        cout << str[i]; // print characters in reverse order
    }
    cout << endl;
    return 0;
}

输出结果:

在这里插入图片描述

8.实现冒泡排序

代码如下:

#include <iostream>
using namespace std;

int main() {
    int arr[10];
    for (int i = 0; i < 10; i++) {
        cin >> arr[i]; // 输入数组元素
    }

    // 冒泡排序
    for (int i = 0; i < 9; i++) { // 外层循环控制排序轮数
        for (int j = 0; j < 9 - i; j++) { // 内层循环控制每轮比较次数
            if (arr[j] > arr[j + 1]) { // 如果前一个元素大于后一个元素,交换它们的位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

    cout << "排序后的数组为:";
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << " "; // 输出排序后的数组
    }
    cout << endl;

    return 0;
}

输出结果:

在这里插入图片描述

9.n行数组之和

题目:输入的第一行有一个数字N代表接下来有N行数组,每一行数组有不固定个数的整数(最多20个,每行最大200个字元),请你写一个程序将每行的总和打印出来。

#include <iostream>
#include <sstream>
using namespace std;
int main()
{
    string s;
    stringstream ss;
    int n, i, sum, a;
    cin >> n;
    getline(cin, s);//读取换行,用cin.get()也可以
    for (i = 0; i < n; ++i)
    {
        getline(cin, s);
        ss.clear();
        ss.str(s);
        sum = 0;
        while (1)
        {
            ss >> a;
            if (ss.fail())//如果badfail或failbit被设置,条件才成立(在这里是想要将下一个
            //字符转换成整数,没有成功,所以导致failbit置为1,
            //而eof()表示是到文件尾,若使用的话,用法如下:)
                break;
            sum += a;
        }
        /*while (!ss.eof())//eof()的用法
        {
            ss >> a;
            sum += a;
        }*/
        cout << sum << endl;
    }
    return 0;
}

输出结果:

输入两组数,第一组数1 2 3 4 5之和为15,第二组数7 8 9之和为24:
在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>