基础算法
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 压缩技术(续集版)
思路:先输入的点阵图存在一个字符串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
计算结果为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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?