#define chg(a,b,t) t=a;a=b;b=t;使用技巧
#define chg(a,b,t) t=a;a=b;b=t;
main(){
int a=10,b=20,z;
chg(a,b,z);//执行完 ab互换;
int t[]={1,2,3,4,5};
chg(t[0],t[1],z);//执行完 t[]={2,1,3,4,5};
}
AB交换算法,异或版,适用int long
#define chg(a,b) a^=b;b^=a;a^=b; //或者 #define chg(a,b) b^=a^=b^=a; //或者 #define chg(a,b) a^=b^=a^=b;使用技巧
#define chg(a,b) a^=b^=a^=b;
main(){
int a=10,b=20;
chg(a,b);//执行完 ab互换;
int t[]={1,2,3,4,5};
chg(t[0],t[1]);//执行完 t[]={2,1,3,4,5};
}
最大公约数算法
递归版
int Gcd(int a, int b){
return b == 0 ? a : Gcd(b, a % b);
}
循环版
int Gcd(int a, int b)
{
int t = b;
while(a%b!=0)
{
t = a%b;
a = b;
b = t;
}
return t;
}
最小公倍数
int Lcm(int a, int b){
return a * b / Gcd(a,b);
}
斐波那契数列
递归版
int Fib(int n){
return (n == 1 || n == 2) ? 1 : Fib(n - 1) + Fib(n - 2);
}
循环版
int fib[1000] = { 0 };
fib[1] = fib[2] = 1;
for ( int i = 3; i < n; i++ )
{
fib[i] = fib[i - 2] + fib[i - 1];
}
素数判断函数
//该函数返回1是素数,返回0则不是素数
int isPrime(int target) {
if (target <= 1) return 0;
for (int i = 2; i*i <= target; i++) {
if (target % i == 0) return 0;
}
return 1;
}
阶乘函数
// 阶乘数很大,一般用long做返回值
long factor(int n){
long ret=1;
for(int i=1;i<=n;i++) ret*=i;
return ret;
}
阶乘求和 sumFactor=1!+2!+3!..+n!
// 阶乘数很大,一般用long做返回值
long sumFactor(int n){
long sum=0;
for(int i=1;i
冒泡排序
#define chg(a,b) a^=b^=a^=b;
void bubble_sort(int *arr, int len) {
int i, j;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1]) {
chg(arr[j],arr[j + 1])
}
}
使用技巧
#include
int main() {
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int len = sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
int i;
for (i = 0; i < len; i++)
printf("%d ", arr[i]);
return 0;
}
二分查找
int searchItem(int *arr,int len, int value){
int low = 0,high = len-1,mid;
while (low <= high) {
mid = (low + high)/2;
if (value > arr[mid])
low = mid+1;
else if (value < arr[mid])
high = mid - 1;
else
return mid;
}
return -1;
}
使用技巧
#include
int main(int argc, const char * argv[]) {
//数组必须是有序数组
int a[10] = {1,2,31,45,52,62,73,86,90,100};
int len=10;
//查找86元素
int l = searchItem(a,len,86);
printf("loc = %dn",l);
return 0;
}
汉诺塔
void hanoi(int n,char A,char B,char C)
{
if(n==1)
printf("Move %d from %c to %cn",n,A,C);
else
{
hanoi(n-1,A,C,B);
printf("Move %d from %c to %cn",n,A,C);
hanoi(n-1,B,A,C);
}
return 0;
}
使用技巧
题目地址 https://www.dotcpp.com/oj/problem2056.html
#include
int main() {
hanoi(4,'A','B','C');
return 0;
}
报数问题
int p[1000]={0};//初始数组 记录人员死亡情况 p[1000]={0}
//设p[n]==0 则人活着,p[n]==1则人死了
int PeopleCount;//scanf 得到实际 玩家数量 PeopleCount
int live=PeopleCount;//记录活人的数量,初始=玩家数量
int now=0;//设定变量 记录现在是第几个玩家进行游戏,开局是第一个人
int code=0;//设定变量,记录目前报数到几,开局是0
int deathCode=3;//设定死亡号码是3
//游戏开始,进入循环,直到live剩下一个玩家
while(live>1){
//先进行活人判断,并报数.
if(p[now]==0) {
code++; //活着就报数
}
//报数完了,进行死亡判断
if(code==deathCode) {
p[now]=1;//如果数到3,则当前人死亡.
live--;//活人减少一个
code=0;//报数变成0,等待下一位玩家报数时,改写成1
}
//击鼓传花,移到下一玩家
now++;
now%=PeopleCount;
}



