算法之家

zrg1390556487@gmail.com

1. 初级LV.1

1.1. Hello World

#include<stdio.h>
void main(){
     printf("Hello World!");
}

1.2. a+b

#include<stdio.h>
void main(){
        int a,b;
        printf("Please enter two integers separated by commas!\n");
        printf("a=");
        scanf("%d",&a);
        printf("b=");
        scanf("%d",&b);
        printf("a+b=%d\n",a+b);
}

1.3. 菱形打印

#include<stdio.h>
void print(int n){
     int i,j;
     for(i=1;i<=n;i++){
             // 首先打印前面的空格
             for(j=1;j<=n-i;j++){
                     printf(" ");
             }
             // 打印菱形上半部分
             for(j=n-i+1;j<n+i;j++){
                     printf("*");
             }
             printf("\n");
     }
     for(i=n-1; i>=1; i--) 
     { 
             for(j=1; j<=(n-i); j++) 
             { 
                     printf(" "); 
             } 
             for(j=n-i+1; j<n+i; j++) 
             { 
                     printf("*"); 
             } 
             printf("\n"); 
     } 
}
   void printstar(int n) 
{ 
    int i,j;    //行,列 
    for(i=0; i<2*n-1; i++) 
    { 
        for(j=0; j<2*n-1; j++) 
        { 
            if(i<n) 
            { 
                if(j>=n-i-1&&j<n+i) 
                { 
                    print('*'); 
                } 
                else 
                { 
                    print(' '); 
                } 
            } 
            else 
            { 
                if(j>=i-n+1&&j<3*n-i-2) 
                { 
                    print('*'); 
                } 
                else  
                { 
                    print(' '); 
                } 
            } 

        } 
        print('\n'); 
    } 
} 

1.4. 大小写转换

#include<stdio.h>
#include<string.h>
/**
 * Conversion
 * a-z <--> A-Z
 */
//init
char convert(char ch);
//main
void main(){
        int i,j;
        int n,length;
        char arr[300];
        printf("Please enter n value.\n");
        scanf("%d",&n);
        for(i=0;i<n;i++){
                gets(arr);
                length=strlen(arr);
                for(j=0;j<=n;j++){
                        arr[j]=convert(arr[j]);
                }
                for(j=0;j<length;j++){
                        putchar(arr[j]);
                }
        }
}
//convert
char convert(char ch){
        if(ch>='a'&&ch<='z'){
                return ch-32;
        }else if(ch>='A'&&ch<='Z'){
                return ch+32;
        }else{
                return ch;
        }
}

1.5. 水仙花数

#include<stdio.h>
/**
 * 水仙花数(Narcissus number)
 * 描述:如果一个三位数的每个数位的三次方和就是本身。
 * */
int isYes(int n);
void main(){
        int l,m,n,flag;
        printf("Please enter 3-digit interger,Separated by commas!\n");
        while(scanf("%d,%d",&m,&n)!=EOF){
                flag=0;
                for(l=m;l<=n;l++){
                        if(isYes(l)){
                                flag=1;
                                printf("%d ",l);
                        }
                }
                if(flag==0){
                        printf("No!");
                }
        }
}
int isYes(int n){
        int i,j,k;
        i=n/100;//百位
        j=n/10%10;//十位
        k=n%10;//个位
        if(n==i*i*i+j*j*j+k*k*k){
                return 1;
        }else{
                return 0;
        }
}

1.6. 青蛙王子

#include<stdio.h>
/**
 * 一个王子被巫师诅咒,……
 * */
void main(){
        unsigned int a,b,c,temp,min;
        while(scanf("%u %u %u",&a,&b,&c),a!=0||b!=0||c!=0){
                if(a==0&&b==0){
                        printf("No\n");
                        continue;
                }
                if(b>a){
                        temp=a;
                        a=b;
                        b=temp;
                }
                if(b==0){
                        min=a;
                }
                if(a==b){
                        min=a;  
                }
                while(a>b&&b!=0){
                        temp=a-b;
                        if(temp>b){
                                a=temp;
                        }else if(temp<b){
                                a=b;
                                b=temp; 
                        }else{
                                min=temp;
                                break;
                        }
                }
                if((c%min)==0){
                        printf("Yes\n");
                }else{
                        printf("No\n");
                }
        }
}

1.7. 海明距离

#include<stdio.h>
/**
 * 海明距离(Haiming Distance)
 * 二进制情况下,一个整数变成另一个整数需要翻转的位数。
 * */
void main(){
        int x,y,m,n;
        int dist=0;
        printf("Please enter 2-digit integer,Separated by commas!\n");
        scanf("%d,%d",&x,&y);
        while(x!=0||y!=0){
                m=x%2;x=x/2;
                n=y%2;y=y/2;
                if(m!=n){
                        dist++;
                }
        }
        printf("x and y [Haiming Distance]:%d",dist);
}

1.8. 哈密尔顿距离

#include<stdio.h>
/**
 * 哈密尔顿距离
 * Hamilton.c
 * 有两个点P[x1,y1],Q[x2,y2],定义其哈密尔顿距离D=|x1-x2|+|y1-y2|
 * */
void main(){
        int x1,y1,x2,y2,temp_x,temp_y;
        printf("Please enter 4 numbers,each 2 numbers are Separated by commas.Format:'3,4 5,6'\n");
        scanf("%d,%d %d,%d",&x1,&y1,&x2,&y2);
        if(x1>x2){
                temp_x=x1-x2;
        }else{
                temp_x=x2-x1;
        }
        if(y1>y2){
                temp_y=y1-y2;
        }else{
                temp_y=y2-y1;
        }
        printf("result:%d\n",temp_x+temp_y);
}

1.9. 数码平方和

#include<stdio.h>
/**
 * 数码平方和
 * 一个整数各个数码的平方和的个位数成为分类值。给你一个区间[a,b],一个数码n,求这个区间[a,b]内的分类值n。
 * */
void main(){
        int a,b,c,d,e;
        printf("Please enter 3 numbers.\n");
        scanf("%d,%d,%d",&a,&b,&e);
        int i,j,k,n,f,g;        
        for(i=0;i<=b;i++){
                g=i;c=i;
                f=0;d=c;
                for(;d!=0;){
                        c=d%10;
                        f=f+c*c;
                        d=d/10;
                }
                f=f%10;
                if(f==e){
                        k++;
                }
        }
        printf("result:%d\n",k);
}

1.10. 统计字符

#include<stdio.h>
#include<string.h>
/**
 * Statistics Strings
 * 输入一字符串,请找出出现次数最多的大写字母。
 * 采用哈希映射思想,把A-Z映射到哈希表中保存其出现的次数,最后输出结果。
 * */
void main(){
        char str[100],z[1000];
        int i,j,k,sum[30],a;
        gets(z);//读取字符串
        memset(sum,0,sizeof(str));
        for(i=0;i<strlen(z);i++){
                sum[z[i]-'A']++;
        }
        k=0;
        for(i=0;i<30;i++){
                if(k<sum[i]){
                        k=sum[i];
                        a=i+'A';
                }
        }
        printf("%c %d\n",a,k);  
}

1.11. 数字塔

/**
 * Digital Tower
 *    1
 *   222
 *  33333
 * */
#include<stdio.h>
void main(){
        int n;
        printf("Please enter any number!\n");
        scanf("%d",&n);
        int i,j;

}

1.12. 有多少个1

#include<stdio.h>
#include<stdlib.h>
void hanoi(int n,char x,char y,char z);
int main(void){
        hanoi(6,'A','B','C');
        return EXIT_SUCCESS;    
}
void hanoi(int n,char x,char y,char z){
        if(n==0){

        }else{
                hanoi(n-1,x,z,y);
                printf("%c->%c,",x,y);
                hanoi(n-1,z,y,x);
        }
}

1.13. 字符串逆序


1.14. 回文字串


1.15. 凯撒的密码


1.16. 最小公倍数


1.17. 素数判定


1.18. 素数个数


1.19. 分数加减法


1.20. 合法的整数


1.21. 质因数分解


1.22. 歌德巴赫猜想

1.23. 替换空格

1.24. 队列的实现

1.25. 栈的实现

1.26. 循环队列

1.27. 合并两个有序链表

1.28. 逆转一个链表

1.29. 从尾到头打印链表

1.30. 链表中倒数第k个结点

1.31. O(1)时间内删除链表结点

2. 中级LV.2

2.1. 递归之杨辉三角

2.2. 递归之斐波那契数列

2.3. 递归之汉诺塔

2.4. 分治之二分搜索

2.5. 旋转数组的最小数字

2.6. 分治之棋盘覆盖

2.7. 回溯之全排列

2.8. 回溯之N皇后问题

2.9. NFS深度优先搜索

2.10. BFS广度优先搜索

2.11. BFS+记录路径

2.12. 回溯之旅行售货员

2.13. 回族之0+1背包问题

2.14. 二叉树遍历

3. 高级LV.3

3.1. 动态规划之拦截导弹

3.2. 动态规划之完全背包

3.3. 动态规划之01背包

3.4. 动态规划之统计单词个数

3.5. 最长公共字符子序列

3.6. 最小生成树Prim算法

3.7. 最小生成树Kruskal算法

3.8. 网络流之最大流(EK)

3.9. 二分图最大匹配算法

3.10. 最小费用流之飞镖

3.11. 网络流之方格取数

3.12. 强联通分量-Kosaraju算法

3.13. 博弈论之取石子游戏

3.14. 图论之拓扑排序