算法学习笔记

1.6k words

入门


循环结构

P1307数组反转

如何将数字逐位剥离

while (n != 0)
{
    int t = n % 10;
    n /= 10;
}

如何求解

int ans = 0;
ans = 10 * ans + t;

随机数

计算机通过确定的算法生成“伪随机数”,因此每次执行随机数算法前都要“喂给它”不同的初始值(srand()函数)作为随机数种子,这样才能生成不同的随机数。喂给它当前的时间就是一个比较好的选择,当然也可以把部分输入数据作为随机数种子。

int ans;
srand(time(0)); // 以当前时间作为随机数种子
ans = rand() % 100 + 1; // 定义变量ans是一个1~100的随机数

rand() % a 看起来能产生一个 0 到 a - 1 的随机数,但是每个数字并不是等可能的。假设 RAND_MAX 是 32767 ,取 0 ~ 99 的随机数时,抽到 0 ~ 67 的可能要比剩下的数字大一点。如果 RAND_MAX 远大于 a 时,影响并不大。


质数口袋

P5723 【深基4.例13】质数口袋 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

如何判断质数:如果一个大于1的整数仅能被1和自身整除,它就是一个质数,否则就是合数(1既不是质数也不是合数)。

#include <iostream>
using namespace std;

int main()
{
    int L;
    cin >> L;
    int i = 2, weight = 0, count = 0;
    // 从2开始
    for (int i = 2;; i++)
    {
        bool flag = true; // 质数标识
        for (int j = 2; j * j <= i; j++)
            if (i % j == 0)
            {
                flag = false; // i可以被j整除,i不是质数,标识改变
                break;        // 退出j的for循环
            }
        if (flag == false)
            continue; // 如果不是质数,i++,进入while的下一循环
        if (i + weight > L)
            break; // 如果超重了,直接退出循环
        cout << i << endl;
        count++;
        weight += i;
    }
    cout << count << endl;
    return 0;
}

质因数分解

P1075 [NOIP2012 普及组] 质因数分解 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

想复杂了,只要找出 n 的最小约数,再用 n 除以这个数,就能得到结果。*其实这是一道数学题*

一个数能且只能分解为一组质数的乘积。

#include <iostream>
using namespace std;

int main()
{
    long long n;
    cin >> n;
    for (int i = 2; i <= n; i++)
        if (n % i == 0)
        {
            cout << n / i;
            break;
        }
    return 0;
}

其他


常见的输入输出占位符

占位符 说明
%d 一个十进制整数
%nd 输出一个整数,如果不足 n 位,前面用空格补齐直到够 n 位
%.nf 输出一个固定n位小数的浮点数
%0nd 输出一个整数,如果不足 n 位,前面用 0 补齐知道够 n 位
%c 一个 char 类型的字符
%s 一个字符串

关于浮点数精度误差

一种解决方式是先乘以 10^n 让其不触及浮点数,最后将其结果除回来。

数学函数

函数原型 说明
double sin(double x) double cos(double x) 三角函数正弦和余弦,x是弧度
double exp(double x) 返回$$e^x$$,其中e是自然常熟
double pow(double x, double y) 返回$$x^y$$,也可以用来运算多次根式
double sqrt(double x) 返回$$\sqrt{x}$$
double ceil(double x) 返回大于或等于x的最小的整数值(上取整)
Comments