栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言关键算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言关键算法

C语言关键算法 AB交换算法 万能版,适用float double int long
#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;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033496.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号