算法的一些基本规律和精髓
# include <iostream>
# include <vector>
using namespace std;
vector<int> v;
int main()
{
int n, m;
while(1) //这个代码是为了让程序循环下去,下面有条件能让这个循环跳出来。
{
cin>>n>>m;
if(n == 0|| m == 0)
{
break; //跳出循环。
}
v.clear(); //这个代码是每次输入n,m的时候,重新会开辟一个动态数组。
for(int i = 1; i <= n; i++)
{
v.push_back(i); //这个代码是让v数组往后加值。
}
vector<int> ::iterator it = v.begin(); //定义一个迭代器, 让这个迭代器指向这个动态数组。
while(v.size()> 1) //这个是关键,这个是让数组剩下最后一个元素了,不让他循环了。
{
for(int i = 1; i < m; i++)
{
it++;
if(it == v.end()) //当it指向结尾时, 让it重新返回数组开头。
{
it = v.begin();
}
}
it = v.erase(it); //删除it指向当前的元素。
if(it == v.end())
{
it = v.begin();
}
}
cout<<v.front()<<endl; //因为数组只剩下最后一个元素了,直接用front输出元素。
}
return 0;
}
这个代码中的 ”“”while(v.size()> 1)“”“” 这个代码非常好,这个是为了让数组剩下最后一个的时候直接输出这个东西。
输入数位寻找最大值。
while(scanf("%d", &num), num >= 0)
{
a[num]++; //从这里往上的代码就是输入值,输入的值对应到相应的数组当中,然后再当年数组上++。也就是说加入输入了三个5 那么再 a[5]上加3
}
从这里往上的代码就是输入值,输入的值对应到相应的数组当中,然后再当年数组上++。也就是说加入输入了三个5 那么再 a[5]上加3。(这是一个很好的方法)
二维坐标某一点的走路。
int dx[] = {-1, 0, 1, 1, 1, 0, -1, -1};
int dy[] = {1, 1, 1, 0, -1, -1, -1, 0};
这个点在(0, 0);
然后 (x + dx[i], y + dy[i])这样走坐标。
数字0 - 9转化为字符0 - 9公式。
注意,实际上转化为二进制的时候一定要多多的关注只输入一个零的时候该怎么办?
这个时候就要单独判断就行
if(n == 0)
{
printf("0");
}
int t;
t = t + '0';
阶乘, 递归。
int fact(int n)
{
if(n == 0 || n == 1)
return 1;
return n * fact(n - 1);
}
高效算法,哈哈哈哈。
逆序数字:输入一个数字,把反转的数字存在一个变量中。
while (n > 0)
{
result = result * 10 + n % 10;
n /= 10;
}
这个代码就是,把输入的数字每次算出自己的余数,然后再乘以10再加上下一次除以10的余数。
这个算法可用于回文数。
这个代码是值得去记忆的。
获得一个浮点数的小数部分。
m = 144.123 我想获得m的小数部分,我改怎么办呢?
while(m >= 1)
{
m--;
}
直到减到m小于1为止然后停止下来,这时候就会获得m的小数部分。哈哈哈哈哈。
求数字最大值
一般题目遇见很大很大的数字(例如:98874515157842648787454141512)一般来说就不适用于int --- long --- long long这些类型的变量了。这种就需要用字符串来解出这个题目 。
把这个数字存到字符串当中。
求因子和;
//实际上要求一个正整数的因子之和,只用从1到不包含这个数的本身遍历下来(也是就让区间整数(1,n-1)),然后正整数除以这个遍历的数余数等于0既是这个正整数的因子。
回文数代码:解释在代码里面了。
# include <iostream>
using namespace std;
int fac(int n)
{
int result = 0;
while(n>0)
{
result = result * 10 + n % 10; //其实这个代码还是用到了就是把一个数字的逆序再存到一个变量当中。
n /= 10;
}
return result;
}
bool is_reversenumber(int n)
{
return n == fac(n);
}
int main()
{
int n, m;
cin>>n>>m;
for(int i = n; i <= m; i++)
{
if(is_reversenumber(i)) //当i是符合回文数的条件时候,返回true回文数还是得用一下bool类型啊。
cout<<i<<" ";
}
return 0;
}
STL库的理解和解释
STL库的区别
动态数组vector中的添加元素是push_back();
队列queue中的往后添加元素是push();
map<char, int> 这个里面会自动按照char的字符大小进行排序。
set<int> set里面会有自动排序,去重数字。
queue标准库。
q.empty() 如果队列为空返回true,否则返回false
q.size() 返回队列中元素的个数
q.pop() 删除队列首元素但不返回其值
q.front() 返回队首元素的值,但不删除该元素
q.push() 在队尾压入新元素
q.back() 返回队列尾元素的值,但不删除该元素
stack标准库。
s.push(x); //入栈
s.pop(); //出栈,只是删除栈顶元素,并不返回该元素
s.top(); //访问栈顶元素
s.empty(); //判断栈空,当栈空时,返回true
s.size();//访问栈中元素个数
pair<int, int>这个库可以联系所有的stl库,例如,vector<pair<int , int >> 可以把pair里面的数联系在vector当中。
当然map也可以映射两个类型相同的数
简单的map映射程序。
# include <iostream>
# include <map>
using namespace std;
int main()
{
map<int, int> arr;
arr[3] = 6;
arr[9] = 7;
arr[5] = 4;
for(auto i : arr)
{
cout<<i.first<<" "<<i.second<<endl;
}
return 0;
}
这个能输出map里面的first,和second的数值。
set这个库能自动排序,和去重。
set这个里面还没有自己的往后赋值,要是想把要想的元素数据加入到set当中必须要用 insert这个东西。
例如简单程序set和pair结合。
# include <iostream>
# include <map>
# include <set>
using namespace std;
int main()
{
set<pair<int, int>> data = {{3,5}, {89,11},{87,54}, {3,5}, {8, 4}};
for(auto i : data)
{
cout<<i.first<<" "<<i.second<<endl;
}
return 0;
}
data数组里面有很多数,一般set是按照<int, int>第一个int类型来进行对data里面的数组排序
内部过程。
这个是没加set的时候,即只是pair<int, int>arr
| 3 | 5 |
| 89 | 11 |
| 87 | 54 |
| 3 | 5 |
| 8 | 4 |
加了set之后,即set<pair<int, int>>arr 这个代码。
| 3 | 5 |
| 8 | 4 |
| 87 | 54 |
| 89 | 11 |
vector begin() 和 end() 实际指向的位置。

c++结构体的多数据排序
struct pass{
int x, y, z;
bool operator < (const pass & rhs) const
{
if(x != rhs.x)
{
return x < rhs.x;
}
else if(y != rhs.y)
{
return y < rhs.y;
}
else
{
return z < rhs.z;
}
}
};
vector<pass> v1; 这个排序是能按照数据的x y z依次从小到大排序。
博客介绍了算法的基本规律和精髓,包括输入数位找最大值、二维坐标走路、数字字符转换、阶乘递归等算法,还提及获取浮点数小数部分、求数字最大值、因子和、回文数等内容。此外,对STL库进行了解释,如queue、stack、vector等标准库的使用及特性。
5940

被折叠的 条评论
为什么被折叠?



