C语言算法

【C语言】Dijkstra算法详解 Dijkstra算法是一种高效、实用的图论算法,适用于解决单源最短路径问题。通过本文的介绍,希望您对Dijkstra算法有了更深入的了解。在实际应用中,可以根据具体场景选择合适的算法和数据结构,以提高解决问题的效率。在C语言实现中,我们使用了邻接矩阵来表示图,并使用了一个简单的数组来实现优先队列的功能。这种方法在节点数量较少时是可行的,但是当图的规模较大时,使用优先队列的数据结构,如二叉堆或斐波那契堆,可以显著提高算法的效率。需要注意的是,Dijkstra算法不适用于包含负权边的图。 阅读详情

1(1).判断素数(prime)

#include <stdio.h>                                           
#include <math.h>
int prime (int n);  //函数声明                                  
int main( ){                                                         
    int n;                                                              
    scanf("%d",&n);                                                  
    if (prime(n)==1)                                      
        printf("%d is a prime.\n",n);                      
    else                                                             
        printf("%d is not a prime",n);                 
return 0;
}
int prime(int n){
    if(n<=1) 
        return 0;
    else if(n==2) 
        return 1;
    else if(n%2==0) 
        return 0;
    for(int i=3;i<=sqrt(n);i+=2){
        if(n%i==0)
            return 0;//如果是main函数内,换成break
    }
        return 1;
}

1(2).寻找素数

编写一个函数,从键盘输入m,输出大于m且紧随m的素数。在主函数中进行输入和输出
#include <math.h>
int prime(int n){
    if(n<=1)
        return 0;
    if(n==2)
        return 1;
    if(n%2==0)
        return 0;
    for(int i=3;i<=sqrt(n);i+=2){
        if(n%i==0)
            return 0;
    }
    return 1;
}
int fun(int m){
    m++;
    while(prime(m)==0)  //注意循环开始条件:m不为素数,加一继续寻找
        m++;
    return m;
}

2.最大公约数(hcf)和最小公倍数(lcd)

辗转相除法(欧几里得算法):

较大数a作除数,较小数b作被除数,两数相除得余数;把b赋为除数,余数赋为被除数,反复相除直至余数为0;最后一次相除的除数为最大公约数,最大公约数*最小公倍数=a*b

原理:对于任意两个正整数啊a,b(a>b),有gcd( a,b)=gcd( b,a mod b)

//a mod b指a除以b的余数,gcd(x,y)表示x,y的最大公约数

#include <stdio.h>                                              
int main(){                                                                
    int hcf(int m,int n);                                                 
    int lcd(int m,int n);
    int m,n,h,l;
    scanf("%d %d",&m,&n);
    h=hcf(m,n);
    l=lcd(m,n);
    printf("最大公约数为%d.\n",h);
    printf("最小公倍数为%d.\n",l);
return 0;
}
int hcf(int u,intv){
    while(v!=0){
        int temp=u%v;
        u=v;
        v=temp;
    }
    return u;
}
int lcd(int u;int v;int h){  //h为最大公约数
    h=hcf(u,v);
    return u*v/h;
}

3.除去数组最值后输出

#include <stdio.h>
int main(){
    int n,i;
    scanf("%d",&n);
    if(n-2<=0){
        printf("None.\n");
        return 0;
    }
    int a[n];
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    int max=a[0],min=a[0];
    for(i=0;i<n;i++){
        if(a[i]<a[0])
            min=a[i];      
        if(a[i]>a[0])
            max=a[i];   
    }
    for(i=0;i<n;i++){
        if(a[i]==max||a[i]==min)//    
            continue;
        else
            printf("%d",a[i]);
    }
return 0;
}​
​

4.合并有序数组为新数组

1 2 9 和3 4 5 6(指针)

1 2 9           1 2 9        1 2 9       1 2 9

3 4 5 6        3 4 5 6     3 4 5 6    3 4 5 6

新数组:1 2 3 4 5 6

已知两个升序数组,将它们合并成一个升序数组并输出。
例如:数组array1={3,6,13,35,54},数组array2={14,19,26,32},合并为新的数组array={3,6,13,14,19,26,32,35,54}。
输入格式:
输入两行升序整数,当每行输入0时,表示输入结束。每行整数的个数1<=N<=10。
输出格式:
输出合并后的升序数组。(最后一个数据后有一个空格)
#include <stdio.h>
int main(){
    int a[10],b[10],c[20];
    int num1,num2;
    int m=0,n=0,t=0;
    while(scanf("%d",&num1)==1&&num1!=0)   //==1保证系统成功读取一个整数
         a[m++]=num1;
    while(scanf("%d",&num2)==1&&num2!=0)   //只用一个num就够了,可删去num2
         b[n++]=num2;
    int i=0,j=0;
    while(i<=m&&j<=n){
         if(a[i]<=b[j])        //相同的数不会被漏掉
              c[t++]=a[i++];
         else
              c[t++]=b[j++];
    }
     while(j<=n)        //while(m>i)不可以,没有条件限制,死循环           
         c[t++]=b[j++];
    while(i>=m)
         c[t++]=a{i++];
    for(int k=0;k<t;k++){
        printf("%d ",c[k]);
    }
    printf("\n");
return 0;
}
    
    

5.字符查找

​查找字符串(长度不超过100)中某字符最后一次出现的位置(下标)并输出,不存在则输出-1。
输入格式:
第一行输入一个字符串(可以包含空格)
第二行输入一个字符
输出格式:
一个整数
#include <stdio.h>
#include <string.h>
int main(){
    char a[100];
    char b;
    int i=0,j;
    while((a[i++]=getchar())!=EOF);//getchar函数不需要参数,!=优先级高于=
    a[i]='\0';                      
    b=getchar();                 或者  gets(a);  //直接读取字符串
    for(j=0;j<i,j++){                 for(int i=0;a[i]!='\0';i++)
        if(a[j]==b) 
            printf("%d",j);
    }
    if(i>j)
        printf("-1");
    return 0;
    }
            

​

6.约瑟夫环问题

N 个人围成一圈,从第一个开始报数,第 M 个将出圈;然后继续报数,每到第 M 个就出圈,直到剩下 K 个人。
输入格式:
输入在一行中给出 N M K 的值,用空格隔开。输入保证数据都是正整数,并且 N > K 。
输出格式:
输出安全离开的出圈顺序。例如:N = 6, M = 5,K = 2,那么出圈顺序是5、4、6、2,剩余3、1。
1.数组法
#include <stdio.h>
void Joseph(int n,int m,int k){
    int a[n];
    int i=0,count=0,k=0;
    //i用来遍历数组a中人的状态
    //count用于统计退出人数
    //k用来报数
    for(i=0;i<n;i++)
        a[i]=1;//1表示在圈里,0表示出圈
    i=0;
    while(count<=n-k){
        if(a[i]){
            k++;
            if(k==m){
                a[i]=0;//当前报数的人出圈
                count++;//出圈人数加一
                k=0;  //重新报数
                continue;//
            }
            i=(i+1)%n;//保证i的取值<n,也包含代码i++
        }
    }
    for (i=0;i<n;i++){
        if(a[i])
            printf("%d ",i+1);
    }
}
int main(){
    int M,N,K;
    scanf("%d %d %d",&N,&m,&K);
    Joseph(N,M,K);
    return 0;
}

7.一元二次方程

float x1,x2,disc,p,q;   //无参函数要想对主函数中的值起作用,可通过全局变量
void greater_than_zero(float a,float b){
    x1=(-b+sqrt(disc))/2*a;
    x2=(-b-sqrt(disc))/2*a;
}
void equal_to_zero(float a,float b){
    x1=x2=-b/2*a;
}
void smaller_than_zero(float a,float b){
    p=-b/2*a;
    q=sqrt(-disc)/2*a;
}

8.每个月的天数

本题要求实现一个简单函数,能计算给定的年份和月份的天数。其中1、3、5、7、8、10、12月有31天,4、6、9、11月有30天,2月平年有28天,闰年有29天。
输入样例:
2002
输出样例:
31 28 31 30 31 30 31 31 30 31 30 31 
#include <stdio.h>
int MonthDays(int year, int month);
int main()
{
    int ndays, month, year;
    scanf("%d", &year);
    for(month = 1; month <= 12; month++){
        ndays = MonthDays(year, month);
        printf("%d ", ndays);
    }
    return 0;
}
int MonthDays(int year, int month){
    int days;
    switch(month){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days=31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            days=30;
            break;
        case 2:
            if((year%4==0&&year%100!=0)||year%400==0)
                //逻辑运算符优先级低于算术运算符
                //闰年:能被4整除但不能被100整除,或能被400整除
                days=29;
            else days=28;
            break;
        default days=0;
    }
    return days;
}

9.数字统计

输入一行字符,统计其中中英文字母、空格、数字和其他字符的个数

//用getchar()函数(遇到换行符'\n'结束)

//a~z:

12.统计一个整数的位数及各位数字(逆序输出)

#include <stdio.h>
int main(){
    int n;
    int t[100];    //数组统计各位数字
    int weishu=0;  //计数器
    scanf("%d",&n);
    if(n<0)
        n=-n;   //考虑负数情况
    do{
        t[weishu++]=n%10;
        n/=10;
    }while(n>0);    //保证n=0时也正常运算
    printf("一共有%d位",位数);
    for(int i=0;i<weishu;i++)
        printf("%d",t[i]);
return 0;
    

12.阿姆斯特朗数

阿姆斯特朗数(Armstrong number)是指一个n位正整数上各位数字的n次方之和等于这个数。特别的,当n=3时,又称水仙花数(Narcissistic number),特指一种三位数,其各位数字之立方和等于该数。请你写一个函数,判断一个正整数是不是阿姆斯特朗数。
int armstrong(int m){
    int t[100];  //数组统计各位数字
    int weishu=0;
     do{
        t[weishu++]=n%10;//注意位数是从0开算,
                        //但结果实际位数就是weishu,因为最后一步赋完值后weishi加一
        n/=10;
    }while(n>0); 
    int chengji=1,sum=0;
    for(int i=0;i<weishu;i++){   //累加累乘
        chengji=1;                        //i<weishu不加等号!!!
        for(int j=0;j<weishu;j++){
            chengji*=t[i];     //某位数字的位数的位数次方
        }
        sum+=chengji;   //做加法
    ]
        if(sum==m)      //if语句亦可换成return sum==m?1:0  //sum==m成立取1,不成立取0
            return 1;
        else
            return 0;
}

13.大整数阶乘

//算法:竖式乘法,小数放上面

                    4 0

x   1 2 3 4 5 6 7


                2 8 0

             2 4 0

          2 0 0

       1 6 0

    1 2 0

    8 0

 4 0


 4 9 3 8 6 8 0

要求实现一个打印较大非负整数阶乘的函数。
void print_factorial(int num){
    if(num<0){
        printf("Invalid input\n");
        return;
    }
    int i,j;
    int last=1;  //位数
    int a[100000]={0,1,0};//存放大数,从a[1]开始使用
    for(i=1;i<=n;i++){          //
        for(j=1;j<=last;j++){
            a[j]*=i;
        }
        for(j=1;j<=last||a[j]!=0;j++){        //处理进位
            a[j+1]+=a[j]/10;
            a[j]%=10;
        }
        last=j-1;
    }
    printf(j=last;j>=1;j--){
        printf("%d",a[j]);
    }
}

13(1).对整数的冒泡排序

1.下标法
void bubbleSort(int a[],int c){
    for(int i=0;i<c-1;i++){
        for(int j=0;j<c-i-1;j++){
            if(a[j]>a[j+1]){
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}
2.指针法
void bubbleSort(int *p,int c){
    for(int i=0;i<c-1;i++){
        for(int j=0;j<c-i-1;j++){
            if(*(p+j)>*(p+j+1)){
                int temp=*(p+j);
                *(p+j)=*(p+j+1);
                *(p+j+1)=temp;
            }
        }
    }
}

13(2).对字符数组的冒泡排序

写一个函数,用冒泡法对输入的n个字符进行由小到大排序

void sort(char str[]){
    int temp;
    int n=strlen(str);    //strlen函数求字符数组的长度
                             //使用前要加上#include <string.h>
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-1-i;j++){
            if(str[j]>str[j+1]){
                temp=str[j];
                str[j]=str[j+1];
                str[j+1]=temp;
            }
        }
    }
}

14.字符串反序函数

指针移动法和下标法

1.指针移动法
void inverse(char str[]){
    int len=strlen(str);
    char temp;
    char *left=str,*right=str+len-1;//别忘了减一;
                                    //if不减一right定位的是'\0'
    while(left<right){
        temp=*left;
        *left=*right;
        *right=*temp;
        left++;
        right--;
    }
}

2.下标法
void inverse(char str[]){
    int len=strlen(str);
    int mid=len/2;
    char temp;
    for(int i=0;i<mid;i++){
        temp=str[i];
        str[i]=str[i+len-1];
        str[i+len-1]=temp;
    }
}

15.字符串复制

strcpy函数

结构:strcpy(目标数组,源字符串);

不用strcpy函数:复制的核心是访问到s1中的每个字符,访问同时复制到s2中,最后添加结束符

#include <string.h>
void copy(char s2[],char s1[]){  //s1为源数组,s2为目标数组
    int len=strlen(s1);
    int i;
    for(i=0;s1[i]!='\0';i++)
        s2[i]=s1[i];
    s2[i]='\0';     //添加结束符
}

16.字符串连接

(1).连接到源字符串

strcat函数

结构:strcat(目标字符串,源字符串);

不用strcat函数:先找到源字符串中‘\0’的位置,再逐个访问s2中的每一个字符并连接到s1中,最后添加结束符

void concatenate(char s1[],char s2[]){
    int i,j;
    for(i=0;s1[i]!='\0';i++);  //得到连接的起始位置
    for(j=0;s2[j]!='\0';j++)
        s1[i++]=s2[j];          //连接过程别忘了每次循环i也要加一
    s2[j]='\0';       //添加结束符
}

(2).连接后形成新的字符数组

1.下标法
void concatenate(char s1[],char s2[];char s[]){
    int i,j;
    for(i=0;s1[i]!='\0';i++)   //得到连接的起始位置
        s[i]=s1[i];
    for(j=0;s2[j]!='\0';j++)
        s[i++]=s2[j];          //连接过程别忘了每次循环i也要加一
    s[j]='\0';       //添加结束符
}
2.指针法
void concatenate(char s1[],char s2[];char s[]){
   int*p=s1,*q=s;       
   while(*p){
        *q=*p;
        p++;
        q++;
    }
    p=s2;
    while(*p){
        *p=*q;
        p++;
        q++;
    }
    q='\0';
}

字符串输入函数:char s[20];

scanf("%s",s);    //不需要&;遇空格、‘\0’会终止;

gets(s);

while((s[i]=getchar())!='\n')  i++;

字符串输出函数:

printf("%s",s);    //遇'\0'终止,遇空格不会终止

puts(s);

while(str[i])  putchar(str[i++]);

字符输入函数:char a;

scanf("%c",&a);        //会读取空格

a=getchar();  //getchar函数无参数

字符输出函数:

printf("%c",a);

putchar(a);

17.计算二维数组每一行/列的和

下标法

void sum(int a[M][N]){
    int i,j;
    for(i=0;i<M;i++){
        int hsum=0;
        for(j=0;j<N;j++){
            hsum+=a[i][j];
            printf("第%d行数字之和为%d\n",i+1,hsum);
        }
    }
     for(j=0;j<N;j++){
        int lsum=0;
        for(i=0;i<M;i++){
            lsum+=a[i][j];
            printf("第%d列数字之和为%d\n",j+1,lsum);
        }
     }
}

指针法

本题要求编写程序,使用指针方式求一个给定的m×n矩阵各行元素之和。(例如:scanf("%d", *(matrix + i) + j);  // 使用指针方式访问二维数组元素)

输入格式:
输入第一行给出两个正整数m和n(1<=m<=6, 1<=n<=6),再输入m行数据,每行n个整数,每个整数之间用空格分隔。
输出格式:
输出m个整数,每行1个数。
#include <stdio.h>
int main(){
    int m,n;
    int i,j;
    scanf("%d %d",&m,&n);
    int matrix[m][n];  //if编译失败,可以换成matrix[6][6]
    for(i=0;i<m;i++){
        int sum=0;
        for(j=0;j<n;j++){
            scanf("%d",*(matrix+i)+j);
            sum+=*((*matrix+i)+j);
        }
        printf("%d\n",sum);
    }
    return 0;
}

matrix:其实就是二维数组名,代表二维数组的首地址

matrix+i:第i行的起始地址

*(matrix+i):第i行起始地址存的数字

*(matrix+i)+j:第i行第j列元素的地址

*(*(matrix+i)+j):第i行第j列存的数字

18.二维数组每一行/列最值的差

void Fun(int a[M][N]){
    int i,j;
    for(i=0;i<M;i++){
        int min=a[i][0],max=a[i][0];
        for(j=1;j<N;j++){     //从1开始避免重复
            if(max<a[i][j])
                max=a[i][j];
            if(min>a[i][j])
                min=a[i][j];
        }
        printf("第%d行最大值与最小值的差为%d\n",i+1,max-min);
    }
    for(j=0;j<N;j++){
        int min=a[0][j],max=a[0][j];
        for(i=1;i<M;i++){       //从1开始避免重复
            if(max<a[i][j])
                max=a[i][j];
            if(min>a[i][j])
                min=a[i][j];
        }
        printf("第%d列最大值与最小值的差为%d\n",j+1,max-min);
    }
}

19(1).删除字符串中的某个字符

原理:逐个访问字符数组,目标后字符覆盖目标字符,最后添加结束符‘\0’

//下标加函数法
void del(char s[],char n){  //从字符串s[]中删除字符n
    int len=strlen(s);
    int j=0;
    for(int i=0;i<len;i++){
        if(s[i]!=n)
            s[j++]=s[i];  //未遇到目标字符时,j才加一,但i每次就循环都加一
    }
    s[j]='\0';
}
//不用strlen函数
void del(char s[],char n){
    int i=0,j=0;
    while(s[i]!='\0'){
        if(s[i]!=n)
            s[j++]=s[i];
        i++;
    }
    s[j]='\0';
}

//指针写法
#include <stdio.h>
int main(){
    char s[100];
    gets(s);
    char c;
    while(getchar()!='\n');
    c=getchar();   //保证getchar正确读入目标字符而非换行符
                    //当目标字符不是空格时亦可用scanf
    char *p=s,*q;
    while(*p!='\0'){
        if(*p!=c){
            *q=*p;
            q++;
        }
        p++;
    }
    *q='\0';
    puts(s);
    return 0;
}

例题

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。

要求定义并调用函数delchar(str,c), 它的功能是将字符串 str 中出现的所有 c 字符删除,函数形参str的类型是字符指针,形参c的类型是char,函数类型是void。

#include <stdio.h>
void delchar(char *p,char *q,char c){
    while(*p!='\0'){
        if(*p!=c){
            *q=*p;
            q++;
        }
        p++;
    }
    *q='\0';
}
int main(){
    int repeat;
    scanf("%d",&repeat);
    while(repeat--){   //实现多次输出
        char str[100];
        gets(c);
        char c=getchar();
        char*p=str,*q;
        declear(p,q,c)
        printf("result: ");
        puts(str);
    }
    return 0;
}

19(2).删除字符串中指定下标的字符

编写一个函数,删除字符串s中从下标k开始的n个字符( n和k从键盘输入)
void delstring(char s[],int n,int k){
    int i;
    for(i=k;s[i+n]!='\0';i++)  //删去从下标为k到k+n-1的这些字符
        s[i]=s[i+n];
    s[i]='\0';
}

19(3).删除字符串中的指定子串

strstr函数(字符串查找函数)

结构:char *p=strstr(源字符串,目标字符串)

结果:成功匹配到子串:返回字串第一次出现的起始地址,p!=NULL

           未找到子串:返回NULL,p=NULL

字符串函数参数顺序区分

1.内存修改类(目标字符串在前,源字符串在后)

strcpy,strcat

2.查询/只读匹配类(源字符串在前,目标字符串在后)

strcmp,strstr,strlen

tip:使用前别忘了头文件#include <string.h>

20.数组循环右移

请你写一个函数实现功能为:一个数组a中存有n(>0)个整数,将每个整数循环向右移动m(0≤m≤n)个位置,即将a中的数据由(a0​,a1​...an−1​)变为(an−m​...an−1​,a0,​a1,​an−m−1​),即将数组最后m个数依次移动到最前面的m个位置。

原理:三次翻转:第一次翻转整体;第二次翻转an-1…an-m;第三次翻转an-m-1…a0

void reverse(int a[],int left,int right){
    int temp;
    while(left<right){
        temp=a[left];
        a[left]=a[right];
        a[right]=temp;
        left++;
        right--;
    }
}
void array_rshift(int a[], int n, int m){
    reverse(a,0,n-1);  //翻转整个数组
                      //直接a就行,不要写a[]
    reverse(a,0,m-1);   //翻转m个数(后m个数被翻转到前面)
    reverse(a,m,n-1);  //翻转n-m个数(前n-m个数翻转到后面)
}

21.函数指针做参数,实现两数的互换

#include <stdio.h>
void swap(int *x, int *y){
    int temp;
    trmp=*x;
    *x=*y;
    *y=temp;
}
int main(){
    int m,n;  //定义变量类型为整型,不能用指针
              //指针变量是用来存数字的内存地址,本身不能直接存数字
    scanf("%d %d",&m,&n);
    swap(&m,&n);  //swap函数参数可以传指针也可以传地址
    printf("After swap:%d,%d",*m,*n);
    return 0;
}

22.平均之上(多组测试数据)

输入一个整数n,再输入n个成绩,求大于平均分的成绩个数。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试先输入n,表示数据个数,然后输入n个成绩(整数)。

输出格式:
对于每组测试,输出大于平均分的成绩个数。
#include <stdio.h>
int main(){
    int T,n;
    float ave;
    scanf("%d",&T);
    while(T--){     //每次循环为一组数据
        float sum=0;
        int flag=0;
        scanf("%d",&n);
        int a[n];
        int *p;
        for(p=a;p<a+n;p++){
            scanf("%d",p);
            sum+=*p;
        }
        ave=sum/n;
        for(p=a;p<a+n;p++){
            if(*p>ave)
                flag++;
        }
        printf("%d\n",flag);
    }
    return 0;
}

23.指针法统计字符串中的空格数

输入一个字符串,统计其空格的数量。
要求编写函数  int count_sp(const char *s);
统计并返回字符串 s 中空格的数量。

输入格式:
在一行中输入一个长度不超过 80 的字符串,其中可能含有多个空格。
输出格式:
输出共 2 行:第一行打印输入的原字符串,第二行是该字符串中空格的数量。
#include <stdio.h>
int count_sp(const char *p){   //const作用为防止误改字符
                                //删掉对本代码功能无影响
    int count=0;
    while(*p!='\0'){
        if(*p==' ')
            count++;
        p++;
    }
    return count;
}
int main(){
    char s[80];
    gets(s);
    puts(s);  //puts输出字符串自动换行
    printf("%d",count_sp(s));
    return 0;
}

24.利用指针返回多个函数值

读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。

输入格式:
输入有两行:
第一行是n值;
第二行是n个数。

输出格式:
输出最大值和最小值。
#include <stdio.h>     //头文件要放在最前面
void max_min(int a[],int n,int *max,int *min){  
                        //指针的目的是将最大值和最小值传回主函数中
                        //指针参数所在位置,填写实参时可以是地址&…
                        //定义函数参数时,不能用int a[n]
    *max=a[0];*min=a[0];  //必须要初始化:使用数组第一个元素作为初始值
    for(int i=1;i<n;i++){
        if(*max<a[i])
            *max=a[i];
        if(*min>a[i])
            *min=a[i];
    }
}
int main(){
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int max,min;   //注意不要定义成指针
    max_min(a,n,&max,&min); 
    printf("max = %d",max);
    printf("min = %d",min);
    return 0;
}

25.矩阵转置(指针)

二维数组扁平化:a[m][n];int *p=a;

a[i][j]=*(p+i*n+j);

(1)方阵

定义一个3X3的整形矩阵,函数void move(int *pointer)采用指针方式实现矩阵转置。
输入格式:
例如定义一个二维数组接受3X3的整形矩阵数据。

#include <stdio.h>
void move(int *pointer){
    for(int i=0;i<3;i++){
        for(int j=i+1;j<3;j++){    //只交换上三角
            int temp=*(p+i*3+j);   //相当于temp=a[i][j]
            *(p+i*3+j)=*(p+j*3+i);  //相当于a[i][j]=a[j][i]
            *(p+j*3+i)=temp;       //相当于a[j][i]=temp
        }
    }
}
int main(){
    int a[3][3];
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            scanf("%d",a[i][j]);
    }
    int *p=a;
    move(p);
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            printf("%d",a[i][j]);
            if(j!=2)
                printf(" ");  //避免多余的空格
        }
        if(i!=2)
            printf("\n");  //避免多余的换行
    }
    return 0;
}

(2)普通矩阵

定义新数组存放转置后的元素

核心:b[j][i]=a[i][j]

26.大小字符转换

用函数和指针将给定字母字符串的第一个字母变成大写字母,其它字母变成小写字母。在main函数中接收字符串的输入,改变后的字符串的输出也在main函数中实现。

#include <stdio.h>
void trans(char *p){
    if(*p>='a'&&*p<='z')  //首字母大写
        *p-=32;
    p++;
    while(*p!='\0'){
        if(*p>='A'&&*p<='Z')  //其他字母小写
            *p+=32;
        p++;
    }
}
int main(){
    char s[100];
    gets(s);
    trans(s);
    puts(s);
    return 0;
}

27.指定子序列逆序

设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列,进行逆序处理时要求使用指针方法。

输入格式:
输入包括两行。
第一行输入10个整数n,以空格分隔数字。(1≤n≤10000)
第二行输入逆序开始的位置和数量。

输出格式:
输出处理后的10个数字,以空格分隔数字。
#include <stdio.h>
void reverse(int *p,int m,int n){
    int *left=p+m-1;
    int *right=p+m+n-2;
    while(left<right){
        int temp=*left;
        *left=*right;
        *right=temp;
        right--;
        left++;
    }
}
int main(){
    int a[10];
    int m,n;
    for(int i=0;i<10;i++)
        scanf("%d",&a[i]);
    scanf("%d %d",&m,&n);
    reverse(a,m,n);
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
    return 0;
}

28.(1)找最大数

输入n个数,输出最大数值

#include <stdio.h>
int main(){
    int n,max,a;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",a);
        if(i==0)
            max=a;    //max=a使得后面的数都和第一个数比
        if(a>max)
            max=a;
    }
    printf("Max is %d",max);
    return 0;
}

(2)找最大的字符串

输入n个字符串,输出其中最大的字符串。

#include <stdio.h>
#include <string.h>
int main(){
    int n;
    scanf("%d",&n);
    char s[100];
    char max[100];
    for(int i=0;i<n;i++){
        gets(s);  //scanf("%s",s);
        if(i==0)
            strcpy(max,s);
        if(strcmp(s,max)>0)  //函数结果>0表示前者大,=0表示相等,<0表示后者大
            strcpy(max,s);
    }
    puts(max);//printf("%s",max);
    return 0;
}

29.字符串排序

输入格式:
n     表示n个字符串
n行,n个字符串
输出格式:
排序后的n个字符串
#include <stdio.h>
#include <string.h>
int main(){
    int n;
    scanf("%d",&n);
    char temp[100];
    char s[n][100]; //s2[0],s2[1]和s1地位一样
                     //都可以看作存放字符串的一维数组
    for(int i=0;i<n;i++)
        scanf("%s",s[i]);     //gets(s[i]);
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++){
            if(strcmp(s[j],s[j+1])>0){       //冒泡排序
                strcpy(temp,s[j]);
                strcpy(s[j],s[j+1]);
                strcpy(s[j+1],temp);
            }
        }
    }
    for(int i=0;i<n;i++)
        printf("%s\n",s[i]);
    return 0;
}

30.折半查找法

low=0、high=最后一个元素的下标、mid=(low+high)/2            

所给数x:判断x和mid所指数的大小,若x>mid,则令low=mid+1;若x<mid,则令high=mid-1;

按照由小到大的顺序输入15个整数,放在一个整型数组a[15]中,然后另起一行输入一个整数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“cannot find xxx”。
输入格式:
在一行中输入15个整数,中间以空格分隔;另起一行输入一个任意数
输出格式:
如果该数在数组中,则输出"Has found xx, its position is xx"
如果该数不在数组中,则输出“Cannot find xx”
#include <stdio.h>
int main(){
    int a[15];
    for(int i=0;i<15;i++)
        scanf("%d ",a[i]);      //printf("\n");不用加
    int x;
    scanf("%d",x);
    int low=0,high=14,mid;
    int flag=-1;
    while(low<=high){
        mid=(low+high)/2;       //不能放在循环外
        if(x==a[mid]){
            flag=1;
            break;     //得到结果及时跳出
    }
        else if(x<a[mid])
            high=mid-1;
        else
            low=mid+1;
    }
    if(flag==1)
        printf("Has found %d, its position is %d",x,mid+1);
    else
        printf("Cannot find %d",x);
    return 0;
}

31.选择排序

原理:选择一个指定位置的元素,依次与后面的元素进行比较,如果指定位置元素大,则交换;

指定位置分别为第1个、第2个……第n-1个

void sort(int a[],int n){
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            if(a[i]>a[j]){
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
}

32.(1)从字符串中提取数字

#include <stdio.h>
int main(){
    char s1[100],s2[100];
    gets(s1);
    char *p=s1,*q=s2;
    while(*p!='\0'){
        if(*p>='0'&&*p<='9'){
            *q=*p;
            q++;
        }
        p++;
    }
    *q='\0';
     q=s2;  //指针归位  
    while(*q!='\0'){
        printf("%c",*q);  //注意是%c
        q++;
    }
    return 0;
}

(2)从字符串中提取连续数字

输入一个字符串,内有数字和非数字字符,例如:a123x67 222y35i088 09x8 c,请编写程序,将其中连续的数字作为一个整数,依次存放到一维数组a中。例如前面的字符串,应将123存放到a[0]中,67存放到a[1]中……,最后输出整数的个数以及各个整数的值。

输入格式:
长度不超过100的一个字符串,其中包含整数字符和非整数字符。

输出格式:
第一行输出整数的个数

第2行输出各个整数的值,以空格间隔,最后一个整数后面没有空格。
#include <stdio.h>
int main(){
    char s1[120];
    int num[120]={0};
    gets(s1);
    char *p=s1;
    int *q=num;
    int count=0;
    while(*p!='\0'){
        while(!(*p>'0'&&*p<'9')&&*p!='\0')
            p++;
        while((*p>'0'&&*p<'9')&&*p!='\0'){
            *q=(*q+*p-'0')*10;
            p++;
        }
        *q/=10;
        q++;
        count++;
    }
    q=num;
    for(int i=0;i<count;i++){
        printf("%d",*q++);
    }
    return 0;
}

33.结构体生肖统计

春节至,亲朋好友聚会忙,聚会之人有时会说到自己的生肖。对于给定的若干人的生肖,请统计各种生肖的人数,并按人数从多到小输出各种出现的生肖及其人数。若有多种生肖的人数相同,则按生肖英文单词(详见最后的提示)的字典序输出。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入1个整数n(1<=n<=100)表示聚会人数,再输入n个字符串(长度不超过7且仅包含小写字母),每个字符串表示一个人的生肖。

输出格式:
对于每组测试,按描述要求输出结果,每种出现的生肖及其人数占一行,每行的两个数据之间以一个空格间隔。每两组测试数据之间留一个空行。
#include <stdio.h>
#include <string.h>
    struct shengxiao{
        char name[20];
        int count;
    };
int main(){
    int T;
    scanf("%d",&T);
    while(T--){      //每组作为一次循环
        int n,len=0;  //len表示不重复生肖的长个数
        scanf("%d",&n);
        struct shengxiao a[100];   //结构体数组存放生肖
        for(int i=0;i<n;i++){
            char s[20];
            scanf("%s",s);
            int flag=0;
            for(int j=0;j<len;j++){
                if(strcmp(a[j].name,s)==0){  //数组中找到输入生肖
                    a[j].num++,
                    flag=1;
                    break;
                }
                if(flag==0){       //未找到输入生肖就存入
                    strcpy(a[len].name,s);
                    a[len].num=1;    //刚存入num=1,不能++,会变成随机垃圾值
                    len++:
                }
            }
        }
        for(int i=0;i<len-1;i++){
            for(int j=0;j<len-i-1;j++){
                if(a[j].num<a[j+1].num){        //冒泡排序
                    struct shengxiao t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
                else if(a[j].num==a[j+1].num){
                    if(strcmp(a[j].name,a[j+1].name)>0){
                        struct shengxiao t=a[j];
                        a[j]=a[j+1];
                        a[j+1]=t;
                    }
                }
            }
        }
        for(int i=0;i<len;i++)
            printf("%s %d\n",a[i].name,a[i].num);
    }
    return 0;
}

或者以while (scanf("%d", &n) != EOF)作为结束多组数据输入的依据

34.结构体计算总分及最高分

本题目要求先输入正整数N,然后输入N个类型为结构体stud的数组元素,计算每个学生的总分,输出每个学生的学号、姓名、三门课的成绩及总分;计算全部成绩的平均分并输出;输出总分最高同学的各项信息。
struct  stud {
      int  num;             //学号
            char  name[10];  //姓名
            int  score[3];      //3门课成绩
            int  sum;            //总分
};

输入格式:
先输入不超过10的一个正整数N,然后每行输入一个学生的信息(学号、姓名、三门课成绩)。学号在整数范围内,姓名长度小于10个字符。

输出格式:
首先输出每个学生的信息(包括学号、姓名、三门课成绩、总分),数据项之间空1格,每人一行;再输出全部成绩的平均分;最后输出总分最高(假设没有相同总分)同学的学号、姓名、三门课成绩及总分,数据项之间空1格。
#include <stdio.h>
struct stu{
    int num;
    char name[10];
    int score[3];
    int sum;
};
int main(){
    int N,i,flag;
    float all_sum=0;
    scanf("%d",&N);
    struct stu a[10];
    for(i=0;i<N;i++){
        scanf("%d %c ",&a[i].num,a[i].name);
        scanf("%d %d %d %d ",&a[i].score[0],&a[i].score[1],&a[i].score[2]);
        a[i].sum=a[i].score[0]+a[i].score[1]+a[i].score[2];
        all_sum+=a[i].sum;
        if(i==0)
            flag=i;
        else{
            if(a[flag].sum<a[i].sum)
                flag=i;
        }
    }
    float ave=all_sum/(N*3);
    for(i=0;i<N;i++){
        printf("%d %c ",&a[i].num,a[i].name);
        printf("%d %d %d %d ",a[i].score[0],a[i].score[1],a[i].score[2]);
        printf("%d",a[i].sum);
        printf("\n");
    }
    printf("总平均分=%f",ave);
    printf("%d %c ",&a[flag].num,a[flag].name);
    printf("%d %d %d %d ",a[flag].score[0],a[flag].score[1],a[flag].score[2]);
    printf("%d",a[flag].sum);
}

C语言算法之xxHash算法 xxHash是一种高效、快速的非加密哈希算法,由Yann Collet于2012年开发,因其卓越的速度和低碰撞率而广受欢迎。xxHash特别适用于数据校验、数据索引、哈希表构建等场景,尤其在处理大数据时表现优异。 阅读详情

相关推荐

C语言实现A*算法

C语言实现A*算法 最近搞MTK斯凯冒泡平台的游戏开发,碰到了自动寻路的问题,很多程序员都知道A*算法,既简单有使用!所以我也选择了A*算法,由于时间比较紧,就在网上百度此算法的C实现,确实有很多!但经测试都有不同的问题,并不能用在商业游戏中,所以最后决定还是自己写吧! A*原理 比较简单,网上有很多介绍的!我也是在网上看的,这里就不重复了! 由于我是Java程序员

2693

各种PID算法——用C语言去实现

文章目录前言PID原理简单介绍位置型PID增量式PID位置型PID——C语言增量型PID——C语言积分分离的PID控制算法——C语言抗积分饱和的PID控制算法——C语言变积分的PID控制算法——C语言 前言   PID算法在工业应用中随处可见。大学期间,想做各类科创也少不了PID算法的身影。PID除了需要理解原理,用合理的代码实线PID算法也让许多同学们苦恼,我总结了常用的多种PID算法的C语言实...

Nirvana_Tai的博客 2万+

C语言的语法与算法

C语言的语法: 1、C语言的主要“单词” (1)标识符。C语言的标识符规定由字母、数字以及下划线组成,且第个字符必须是字母或下划线,相当于自然语言中的名词、代词。 (2)保留字(关键字)。它们是C语言规定的、赋予它们以特定含义、有专门用途的标识符,相当于自然语言中的动词、连词、介词,如int、 if…else 等。 (3)常量。常量是有数据类型的,如,123、 12.34, 相当于自然语言中的名...

weixin_42976659的博客 1634

c语言常用算法整理

这里整理c语言常用算法,主要有: 交换算法 查找最小值算法 冒泡排序 选择排序 插入排序 shell排序 (希尔排序) 归并排序 快速排序 二分查找算法 查找重复算法 代码如下: //交换 void swap(int *a, int *b){ int tmp=*a; *a=*b; *b=tmp; } //查找最小 int min(int x, int y) { r...

一航jason 3万+

C语言常用算法

(一)排序算法 1.排序算法就是一次进行两个元素的比较,如果符合要求的话 ,那么就是按照顺序排,如果不不合要求的话,那么就进行比较,直到符合为止,而它的结构也是非常的简单,就是循环嵌套循环,再加一个判断。 代码案例: #include <stdio.h> ​ void sort(int arr[],int len){ int i,j,temp; for(i = ...

覃庆奖 1804

C语言算法实践指南

本文还有配套的精品资源,点击获取 简介:C语言以其强大的性能在算法实现方面备受青睐,它是现代编程语言的重要基石。本主题将深入分析C语言中各种算法类型,包括排序、查找、递归与分治、图和树算法、动态规划、字符串处理、数值计算、内存管理、位操作和数据结构实现等。通过理解数据结构、逻辑推理和数学概念,掌握C语言算法将有助于编写高效且可靠的程序。 1. C语言算法基础 ...

weixin_42437253的博客 1265

c语言的算法总结,C语言算法总结

return flag; }7 冒泡法排序 p118void BubbleSort(int a[], int n) {int i, j,temp;for (i = 0; i < n-1; i++) /*共进行n-1趟排序*/for (j =n-1; j>i ; j--) /*递减循环,从后往前比较,趟号增加,相邻元素对减少*/if (a[j ] &l...

weixin_29356815的博客 460

从零开始搭建一个高性能电流镜:手把手教你设计Wide-Swing Cascode结构

本文详细解析了Wide-Swing Cascode电流镜的设计原理与实战流程。针对低压高性能模拟电路设计的核心挑战,文章手把手指导如何从理论分析、参数计算到仿真验证,搭建一个兼具高输出阻抗和低输出电压裕度的电流镜结构,并深入探讨了偏置电路生成、性能优化及版图匹配等关键要点。

weixin_29294975的博客 616

C语言的图算法

本文介绍了图的基本概念、常用的图表示方法,以及几种常见的图算法,包括深度优先搜索、广度优先搜索、Dijkstra算法、Prim算法和Kruskal算法。这些算法在实际应用中非常有用,掌握它们可以帮助我们处理更复杂的图形问题。在实际开发中,图算法的选择往往取决于具体问题的性质与需求。随着图的规模增大,更高效的算法和数据结构会变得尤为重要。因此,深入理解这些基本算法及其实现,可以为进一步的学习打下坚实的基础。希望本文对读者理解C语言中的图算法有所帮助。

2501_91512580的博客 905

GT911触摸驱动避坑指南:从寄存器读取到多点触控处理的5个关键步骤详解

本文深入解析了GT911触摸驱动开发中的关键步骤与常见问题。从硬件初始化、I2C通信建立,到核心寄存器操作、缓冲区状态管理,再到配置表烧录与多点触控数据解析,提供了详尽的避坑指南。文章结合STM32等平台的实战代码,重点阐述了驱动调试中的时序、中断处理和坐标映射等核心要点,帮助开发者高效实现稳定可靠的多点触控功能。

weixin_29189363的博客 667

OpenMythos深度解析

本文深入解析了kyegomez/OpenMythos项目如何从第一性原理重建Claude Mythos的核心架构。该项目并非直接复制Claude,而是基于公开论文和实验结果推测其可能的设计理念,构建了包含多模态注意力、深度推理引擎、知识检索模块等六大核心组件的模块化架构。重点剖析了分组查询注意力(GQA)的实现细节,展示了KV头扩展等关键技术。该项目已成为大模型开源社区最受关注的研究之一,为理解Claude的架构思想提供了有价值的参考。

Crown_22的博客 516

C语言的算法

C语言作为一种灵活且高效的编程语言,它的算法实现为现代软件开发提供了坚实的基础。从排序、搜索到动态规划,C语言的各种算法均具有广泛的应用场景。掌握这些算法不仅能够提升编程能力,更有助于深入理解计算机科学中的重要概念。通过不断的实践和研究,相信每位程序员都能在C语言的世界中发现更广阔的天地。

2501_90494621的博客 687

3.1使用Python读取excel的二维数据

要使用 Python 读取 Excel 的二维数据,可以使用 openpyxl 或 pandas 库。

kenshin1980的专栏 1029

C语言常见算法

一、基本算法 1.交换(两量交换借助第三者) 例 1、任意读入两个整数,将二者的值交换后输出。 main() {int a,b,t; scanf("%d%d",&a,&b); printf("%d,%d\n",a,b); t=a; a=b; b=t; printf("%d,%d\n",a,b);} 【解析】程序中 加粗 部分为算法的核心,...

亡月杂货铺 4874

【100%通过率】华为od机试C卷【出差 / 员工派遣】Java&Go 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2621

android 9.0Settings休眠时间项(屏幕超时)添加永不休眠功能

在9.0的系统产品开发中,系统中默认息屏时间为1分钟,可以通过在Setting中的息屏时间选项设置对应的息屏时间,但是在开发平板类的产品中,需要实现永不休眠的功能,所以需要在Settings中的息屏时间中添加永不休眠时间这一项来实现这个功能,接下来看息屏时间的相关功能,来添加这个功能

安卓兼职framework和app工程师的博客 2047

c语言算法作用,非常全的C语言常用算法

《非常全的C语言常用算法》由会员分享,可在线阅读,更多相关《非常全的C语言常用算法(39页珍藏版)》请在人人文库网上搜索。1、精品、基本算法1交换(两量交换借助第三者)例 1 、任意读入两个整数,将二者的值交换后输出。main()int a,b,t;scanf(%d%d,&a,&b);printf(%d,%dn,a,b);t=a; a=b; b=t;printf(%d,%dn,a,...

weixin_42189611的博客 444

Cloud Connector RFC 访问控制深度实践:为 SAP BTP ABAP environment 打通安全、可控的远程连接

本文是一份面向企业ABAP团队与平台工程团队的Cloud Connector RFC访问控制配置指南。文章详细介绍了虚拟主机/实例号、负载均衡、资源白名单等核心概念,并提供了从零开始的配置流程。主要内容包括:通过Cloud Connector建立安全隧道的价值(零暴露、最小权限)、两种连接类型(无负载均衡/带负载均衡)的配置方法、资源白名单设置技巧,以及两个典型应用场景(Custom Code Migration远程检查与BAPI调用)的实操案例。指南基于SAP官方文档,包含落地经验与避坑建议,可帮助团队快

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 139

fifo算法c语言程序代码,c语言实现fifo算法及代码

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。二十世纪八十年代,为了避免各开发厂商用的C...

weixin_42388176的博客 5461

Windows 11 安装 MySQL 8.4:安装包方式、下载、安装、使用

本文详细介绍了在 Windows 11 系统下通过 MSI 安装包方式安装 MySQL 8.4 LTS 社区版的完整流程,包括版本选择、下载、自定义安装路径、服务配置、日志设置、示例数据库创建及后续使用方法。同时提供了命令行客户端与图形化工具 DBeaver 的连接与操作演示,适合初学者和开发者快速搭建本地 MySQL 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2239

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

三、C语言的算法

一、算法的基本概念算法的特性算法的优劣(判断算法的好坏) 算法的特性 1、有穷性:一个算法必须在有穷步之后结束,且每一步都可在有穷时间内完成,不能无限执行下去 2、确定性:算法的每一步都有确切的定义 3、可行性:算法的每一步都能够运行 4、输入:一个算法都有一个或多个输入 5、输出:一个算法都有一个或多个输出 算法的优劣(判断算法的好坏) 1、正确性:要满足具体问题的要求 2、可读性:写好的算法能够被理解 3、健壮性:输入非法数据时。系统会做出判断,不会在输入非法数据时造成瘫痪 4、时间复杂度和空间复杂度:

Hyao-J 1692

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C语言描述算法的常用方法是,认识C语言 -算法描述的5种方法

在 C语言中,有 5 种常用的算法描述方法:自然语言、流程图、N-S 图、伪代码和程序设计语言。1. 自然语言描述算法上一讲《算法是什么》中给出的解决问题的算法 a、算法 b 和算法 c 都是用自然语言来表示算法的(见上一节的图2)。自然语言就是我们日常使用的各种语言,可以是汉语、英语、日语等。用自然语言描述算法的优点是通俗易懂,当算法中的操作步骤都是顺序执行时比较直观、容易理解。缺点是如果算法中...

weixin_30395941的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

列举c语言的算法描述,C语言算法

在 编程 纳入必修课的趋势下,程序设计或App设计已是大部分学生必须具备的能力。而数据结构及其算法更是用来培养程序设计逻辑的基础理论,也是有志从事IT行业人员既基础又核心的课程。 本书采用丰富的图例来阐述数据结构和*常用的算法概念,包括分治法、递归法、贪心法、动态规划法、迭代法、枚举法、回溯法等,每个经典的算法都提供了C程序设计语言编写的完整范例代码,每章末尾都安排了大量的习题,这些题目包含各类考...

weixin_28974985的博客 703

C语言的回溯算法

递归函数的参数通常包括当前解的状态、当前解的深度、已选择的元素集合等。```cvoid backtrack(当前状态, 当前深度, 已选择元素集合) {// 判断是否满足结束条件if (满足条件) {// 记录当前解return;// 遍历选择for (每个可选元素) {// 做选择选择当前元素;// 递归调用backtrack(更新后的状态, 当前深度 + 1, 更新后的元素集合);// 撤销选择撤销当前元素;```

2501_91024662的博客 1149
上一篇: memset函数(C++)
Danica368498
博客等级 码龄1年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值