基础算法

1 猜数字

系统随机生成一个1到100之间的数字,玩家进行猜测,如果猜错,提示玩家数字过大或过小,如果猜对恭喜玩家胜利,并且退出游戏。

#include <iostream>
#include <ctime>  // time系统时间
using namespace std;


int main()
{
    // 添加随机数种子,利用系统时间生成随机数
    srand((unsigned int )time(NULL));
    // 生成随机数,rand() % 数据范围(100即0~99),+1就是1~100
    int num = rand() % 100 + 1;
    cout << num << endl;

    int val;
    while (true)
    {
        cout << "请输入数字" << endl;
        cin >> val;

        if (val > num)
        {
            cout << "您输入的数字过大!" << endl;
        }
        if (val < num)
        {
            cout << "您输入的数字过小!" << endl;
        }
        if (val == num)
        {
            cout << "您猜对了!" << endl;
            break;
        }
    }

    system("pause");

    return 0;
}

2 水仙花数

#include <iostream>
using namespace std;

/*水仙花数:一个3位数,它的每个位上的数字的3次幂之和等于它本身
 *先获取所有的3位数
 * 提取百位,十位,个位:
 * 个位:num % 10(取模10即可得个位)
 * 十位:num / 10 % 10(先除10,再取个位即可得十位,例如:153/10=15, 15%10=5)
 * 百位:num / 100(除100即可得百位)
 * 计算是否符合水仙花数
 * */

int main()
{
    int num = 100;
    do
    {
        int num_1 = num % 10;
        int num_2 = num / 10 % 10;
        int num_3 = num / 100;

        if (num == num_1*num_1*num_1 + num_2*num_2*num_2 + num_3*num_3*num_3)
        {
            cout << num << endl;
        }
        
        num++;
    }
    while (num < 1000);

    system("pause");

    return 0;
}

3 打印乘法口诀表

#include <iostream>
using namespace std;

/*九九乘法表:列数*行数=计算结果
 *行数 >= 列数才输出
 * */

int main()
{
    for (int i = 1; i <= 9 ; i++)  // i是行数
    {
        for (int j = 1; j <= i; j++)  // j是列数
        {
            cout << j << "*" << i << "=" << j*i << "\t";
        }
        cout << endl;
    }

    system("pause");

    return 0;
}

4 二分查找

题目:leetcode(704)704. 二分查找 - 力扣(LeetCode)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

代码:(左闭右闭,[low, high],时刻考虑数据是否在范围内)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size() - 1;  // 注意这个size-1是数组最后一位

        while (low <= high)  // 若low = high = 1,[1, 1]合法,故是<=
        {
            int mid = low + (high - low) / 2;  // 防止超int范围,(low+high)/2可能会爆

            if (nums[mid] == target)
            {
                return mid;
            }
            else if (nums[mid] < target)
            {
                low = mid + 1;  // nums[mid]不是target,所以mid+1
            }
            else 
            {
                high = mid - 1;  // 同理
            }
        }
        return -1;
    }
};

代码:(左闭右开,[low, high),时刻考虑数据是否在范围内)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size();  // 注意这个size是数组最后一位+1,右边开区间不包括在内

        while (low < high)  // 若low = high = 1,[1, 1)不合法,故是<
        {
            int mid = low + (high - low) / 2;  // 防止超int范围,(low+high)/2可能会爆

            if (nums[mid] == target)
            {
                return mid;
            }
            else if (nums[mid] < target)
            {
                low = mid + 1;  // nums[mid]不是target,所以mid+1
            }
            else 
            {
                high = mid;  // 右区间是开区间
            }
        }
        return -1;
    }
};

文章参考《代码随想录》二分查找:代码随想录 (二分查找)

5 判断回文数

代码:

// 判断回文数
bool palindrome(int x)
{
    if (x == 0) return 1;
    if (x < 0 || x % 10 == 0) return 0;
	long long y = x, num = 0;  // int y=x,防止x被改变
    while (y != 0)
    {
        num = num * 10 + y % 10;  // 上一次数字的记录进位再加上下一位数
        y /= 10;
    } 
    if (num == x) return 1;
    else return 0;
}

int main()
{
	int ret = palindrome(121);
	cout << ret << endl;
	
	return 0;
}

6 P1320 压缩技术(续集版)

题目:P1320 压缩技术(续集版)

思路:先输入的点阵图存在一个字符串a里,再遍历字符串,判断 a[i] 以及 a[i - 1] 是'0'或'1',从而判断是否发生变号,不变号就对应的计数变量+1,变号就计数变量+1、输出计数变量、且将计数变量归零,计数变量就是cnt0、cnt1。特别的,a第一个数和最后一个数需要特殊处理。

代码:

#include <iostream>
using namespace std;

string a, x;  // a:将所有数存入a中,x:暂存一行一行输入用。

int cnt = 0, cnt0 = 0, cnt1 = 0;  // cnt0:记录'0'个数, cnt1:记录'1'个数

int main()
{
	while (cin >> x)
	{
		a += x;  // 每行输入都存入a 
		cnt++;  // 记录输入几行,即N的值。 
	}
	
	cout << cnt << " ";  // 压缩码第一个值 
	
	// 遍历a,'0'就cnt0++,'1'就cnt1++
	// 如果'0'->'1'或者'1'->'0'发生变号,就输出cnt0或者cnt1 
	for (int i = 0; i < a.size(); i++)
	{
		if (i == 0)  // 特别处理第一个数 
		{
			if (a[0] == '0') cnt0++;
			if (a[0] == '1')
			{
				// 压缩码第二个值必须是0的个数,如果点阵图第一个是1,则压缩码第二个值输出0,即0的个数是0
				cout << "0 "; 
				cnt1++;
			}
		}
		else
		{
			if (a[i] == '0' && a[i - 1] == '0')
			{
				cnt0++;
			}
			if (a[i] == '0' && a[i - 1] == '1')
			{
				cnt0++;
				cout << cnt1 << " ";
				cnt1 = 0;
			}
			if (a[i] == '1' && a[i - 1] == '0')
			{
				cnt1++;
				cout << cnt0 << " ";
				cnt0 = 0;
			}
			if (a[i] == '1' && a[i - 1] == '1')
			{
				cnt1++;
			}
			if (i == a.size() - 1)  // 输出最后一个压缩码 
			{
				if (a[i] == '0') cout << cnt0;
				if (a[i] == '1') cout << cnt1;
			}
		}
	}
	
    return 0;
}

7 前缀和

题目描述:

给定一个数组,q次询问,数组下标(l,r)范围内的和

输入格式:

输入的第一行包含一个整数n,表示数组长度,一个整数 q,第二行表示输入的数组,接下来q行第一个数表示l,第二个数表示r。

输出格式:

输出q行,表示范围内的和。

样例输入:

5 3
1 3 7 5 2
2 4
0 3
3 4

样例输出:

14
16
7

代码:

#include <bits/stdc++.h> 
using namespace std;


const int N = 100000 + 10;

int n, q, l, r;
int a[N], sum[N];

int main() {
	// 数据输入 
	cin >> n >> q;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	
	sum[0] = a[0];
	for (int i = 1; i < n; i++) {
		sum[i] = sum[i - 1] + a[i];
	}
	
	for (int i = 0; i < q; i++) {
		cin >> l >> r;
		cout << sum[r] - sum[l - 1] << endl;
	}
	
	
	return 0;
}

8 判断闰年

代码:

// 判断闰年
bool leap(int year) {
	if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
		return true;
	else
		return false;
} 

9 已知日期求星期

设星期为w,年份为y,月份为m,日期为d

w=(d+2×m+3×(m+1)/5+y+y/4y/100+y/400)%7

计算结果为0~6,对应周一到周日。

注意:1,2月要当成上一年13,14月计算,上述除法均为整除。

具体代码:

#include <iostream>
#include <string> 

using namespace std;

// 日期求星期 
int week(int y, int m, int d) {
	if (m <= 2) {
		m += 12;
		y--;
	}
	return (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
} 

int main()
{
	string s[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
	int w = week(2023, 2, 27);
	cout << s[w] << endl;
		
	return 0;
}
posted @   修凡  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示