y总的代码模板
基础算法数据结构二分查找搜索与图论数学知识求解斐波那契数列的若干方法
判断素数
int isPrime(int n
) {
if (n
< 2) return 0;
for (int i
= 2; i
<= (int)sqrt(n
); ++i
)
if (n
% i
== 0)
return 0;
return 1;
}
最大公约数
int gcd(int a
, int b
) {
return b
? gcd(b
, a
% b
) : a
;
}
int gcd(int a
, int b
) {
while(b
^= a
^= b
^= a
%= b
;
return a
;
}
最小公倍数
int lcm(int a
, int b
) {
return a
/ gcd(a
, b
) * b
;
}
斐波那契
int fabonaci(int n
) {
if (n
== 0 || n
== 1)
return n
;
return fabonaci(n
- 1) + fabonaci(n
- 2);
}
约瑟夫环
int ysf(int n
, int m
) {
return n
== 1 ? 0 : (ysf(n
- 1, m
) + m
) % n
;
}
#按顺序输出出圈编号
int ysf(int n
, int m
, int k
) {
return k
== 1 ? (n
+ m
- 1) % n
: (ysf(n
- 1, m
, k
- 1) + m
) % n
;
}
for (int i
= 1; i
<= n
; ++i
)
cout
<< ysf(n
, m
, i
) + 1 << endl
;
####################################################
int main()
{
int n
, m
, i
, s
= 0;
cin
>> n
>> m
;
for (i
= 2; i
<= n
; i
++)
{
s
= (s
+ m
) % i
;
}
cout
<< s
+ 1;
}
进制转换
任意进制转化为10进制
int Atoi(string s
,int radix
)
{
int ans
=0;
for(int i
=0;i
<s
.size();i
++)
{
char t
=s
[i
];
if(t
>='0'&&t
<='9') ans
=ans
*radix
+t
-'0';
else ans
=ans
*radix
+t
-'a'+10;
}
return ans
;
}
10进制转换为任意进制
内置函数: itoa(num, str, 2); num是一个int型的,是要转化的10进制数,str是转化结果,后面的值为目标进制。【c++中一般用_itoa】
string
intToA(int n
,int radix
)
{
string ans
="";
do{
int t
=n
%radix
;
if(t
>=0&&t
<=9) ans
+=t
+'0';
else ans
+=t
-10+'a';
n
/=radix
;
}while(n
!=0);
reverse(ans
.begin(),ans
.end());
return ans
;
}
c++按指定进制输出
#include <bitset>
#include<iostream>
using namespace std
;
int main()
{
cout
<< "35的8进制:" << std
::oct
<< 35<< endl
;
cout
<< "35的10进制" << std
::dec
<< 35 << endl
;
cout
<< "35的16进制:" << std
::hex
<< 35 << endl
;
cout
<< "35的2进制: " << bitset
<8>(35) << endl
;
return 0;
}
十进制转二进制
void dectobin(int n
) {
if (n
== 0 || n
== 1)
cout
<< n
;
else {
dectobin(n
/ 2);
cout
<< n
% 2;
}
}
二进制转十进制
int toten(int x
){
int ans
= 0, cnt
= 0;
while(x
){
ans
+= (pow(2,cnt
++) * (x
% 10));
x
/= 10;
}
return ans
;
}
###########################################
int toten(string s
) {
int ans
= 0, len
= s
.size();
for (int i
= 0; i
< len
; ++i
) {
ans
+= ((s
[i
] - '0') * pow(2, len
- i
- 1));
}
return ans
;
}
十进制转八进制
void dectooct(int n
) {
if (n
>=0 && n
< 8)
cout
<< n
;
else {
dectooct(n
/ 8);
cout
<< n
% 8;
}
}
十进制转十六进制
string str
="0123456789ABCDEF"
void dectohex(int n
) {
if (n
>=0 && n
< 16)
cout
<< str
[n
];
else {
dectooct(n
/ 16);
cout
<< str
[n
% 16];
}
}
高精度加法
string
add(string a
, string b
) {
string c
;
int la
= a
.size(), lb
= b
.size();
if (la
< lb
)
for (int i
= 0; i
< lb
- la
; ++i
)
a
= "0" + a
;
else
for (int i
= 0; i
< la
- lb
; ++i
)
b
= "0" + b
;
int tmp
= 0;
for (int i
= a
.size() - 1; i
>= 0; --i
) {
c
= char((a
[i
] - '0' + b
[i
] - '0' + tmp
) % 10 + '0') + c
;
tmp
= (a
[i
] - '0' + b
[i
] - '0' + tmp
) / 10;
}
if (tmp
)
c
= char(tmp
+ '0') + c
;
return c
;
}
高精度减法
int arr
[MAX
], brr
[MAX
], c
[MAX
];
void substract(string a
, string b
) {
int flag
= 0;
if (a
.size() < b
.size() || a
.size() == b
.size() && a
< b
) {
swap(a
, b
);
flag
= 1;
}
for (int i
= a
.size(); i
> 0; --i
)
arr
[i
] = a
[a
.size() - i
] - '0';
for (int i
= b
.size(); i
> 0; --i
)
brr
[i
] = b
[b
.size() - i
] - '0';
int c_size
= max(a
.size(), b
.size());
for (int i
= 1; i
<= c_size
; ++i
) {
if (arr
[i
] < brr
[i
]) {
arr
[i
+ 1]--;
arr
[i
] += 10;
}
c
[i
] = arr
[i
] - brr
[i
];
}
while (!c
[c_size
]) {
c_size
--;
}
if (flag
)
cout
<< "-";
for (int i
= c_size
; i
> 0; --i
)
cout
<< c
[i
];
if (c_size
< 1)
cout
<< 0;
}
大数乘法
#define MAX 1000000
int a
[MAX
], b
[MAX
], c
[MAX
];
void multiply(string A
, string B
) {
int flag
= 0;
if (A
[0] == '-' && b
[0] != '-') {
flag
++;
A
= A
.substr(1);
}
if (A
[0] != '-' && B
[0] == '-') {
flag
++;
B
= B
.substr(1);
}
int LA
= A
.size(), LB
= B
.size();
memset(a
, 0, sizeof(a
));
memset(b
, 0, sizeof(b
));
memset(c
, 0, sizeof(c
));
for (int i
= 0; i
< LA
; ++i
) a
[i
] = A
[LA
- 1 - i
] - '0';
for (int i
= 0; i
< LB
; ++i
) b
[i
] = B
[LA
- 1 - i
] - '0';
for (int i
= 0; i
< LB
; ++i
)
for (int j
= 0; j
< LA
; ++j
)
c
[i
+ j
] += b
[i
] * a
[j
];
for (int i
= 0; i
< LA
+ LB
; ++i
)
if (c
[i
] >= 10) {
c
[i
+ 1] += c
[i
] / 10;
c
[i
] %= 10;
}
int i
= LA
+ LB
;
while (c
[i
] == 0)
--i
;
if (flag
== 1)
cout
<< '-';
if (i
< 0)
cout
<< 0;
else
for (; i
>= 0; --i
)
cout
<< c
[i
];
}
分治法求最大值(类比求最小值)
int find_max(int* a
, int low
, int hight
) {
int max
;
if (low
== hight
)
return a
[low
];
else {
int mid
= (low
+ hight
) / 2;
int left_max
= find_max(a
, low
, mid
);
int right_max
= find_max(a
, mid
+ 1, hight
);
return max
= left_max
> right_max
? left_max
: right_max
;
}
}
冒泡排序
void Bubble_Sort(int* a
, int n
) {
for (int i
= n
- 1; i
> 0; --i
)
for(int j
=0;j
<i
;++j
)
if (a
[j
] > a
[j
+ 1]) {
int tmp
= a
[j
];
a
[j
] = a
[j
+ 1];
a
[j
+ 1] = tmp
;
}
}
选择排序(升序)
void Selection_Sort(int *a
, int n
) {
for (int i
= 0; i
< n
- 1; ++i
) {
int min_index
= i
;
for (int j
= i
+ 1; j
< n
; ++j
) {
if (a
[j
] < a
[min_index
])
min_index
= j
;
}
int tmp
= a
[i
];
a
[i
] = a
[min_index
];
a
[min_index
] = tmp
;
}
}
插入排序
void Insertion_Sort(int *a
, int n
) {
for (int i
= 1; i
< n
; ++i
) {
for (int j
= 0; j
< i
; ++j
)
if (a
[i
] < a
[j
]) {
int tmp
= a
[i
];
for (int k
= i
; k
> j
; --k
)
a
[k
] = a
[k
- 1];
a
[j
] = tmp
;
break;
}
}
}
归并排序
void Merge(int *a
, int L
,int M
,int R
) {
int left_size
= M
- L
,
right_size
= R
- M
+ 1,
*left
= new int[left_size
],
*right
= new int[right_size
];
for (int i
= L
; i
< M
; ++i
)
left
[i
- L
] = a
[i
];
for (int i
= M
; i
<= R
; ++i
)
right
[i
- M
] = a
[i
];
int i
= 0, j
= 0, k
= L
;
while (i
<left_size
&&j
<right_size
) {
if (left
[i
] < right
[j
])
a
[k
++] = left
[i
++];
else
a
[k
++] = right
[j
++];
}
while (i
<left_size
) {
a
[k
++] = left
[i
++];
}
while (j
<right_size
) {
a
[k
++] = right
[j
++];
}
}
void Merge_Sort(int* a
, int L
, int R
) {
if (L
== R
)
return;
int M
= (L
+ R
) / 2;
Merge_Sort(a
, L
, M
);
Merge_Sort(a
, M
+ 1, R
);
Merge(a
, L
, M
+ 1, R
);
}
后序中序构建二叉树
Node
* buildTree(int* post
, int* in
, int n
) {
if (n
== 0)
return NULL;
int* mid
= in
;
while (*mid
!= *(post
+ n
- 1)) mid
++;
Node
* T
= new Node
;
T
->data
= *mid
;
int m
= mid
- in
;
T
->lc
= buildTree(post
, in
, m
);
T
->rc
= buildTree(post
+ m
, mid
+ 1, n
- m
- 1);
return T
;
}
前序序中序构建二叉树
Node
* buildTree(int* pre
, int* in
, int n
) {
if (n
== 0)
return 0;
int* mid
= in
;
while (*pre
!= *mid
)mid
++;
Node
* T
= new Node
;
T
->data
= *mid
;
int m
= mid
- in
;
T
->lc
= buildTree(pre
+ 1, in
, m
);
T
->rc
= buildTree(pre
+ 1 + m
, mid
+ 1, n
- m
- 1);
return T
;
}
汉诺塔问题
void hanoiTower(int n
, char a
, char b
, char c
) {
if (n
== 1)
cout
<< a
<< " -> " << c
<< endl
;
else {
hanoiTower(n
- 1, a
, c
, b
);
cout
<< a
<< " -> " << b
<< endl
;
hanoiTower(n
- 1, b
, a
, c
);
}
}