zoukankan      html  css  js  c++  java
  • c语言进阶11-经典算法代码

    重要算法一览

    #include "stdio.h"
    #include "stdio.h"
    void main()
    {
        int a,b,c,i,n;
        int x,y,z,count;
        int day=10,num=1;   //day表示天数从第十天逆推  num表示当天桃子的数量
        float h=0.0005;
        int ci=0;               
        while(1)
        {
            printf("		==========经典算法==============
    ");
            printf("		1、穷举法:百钱买百鸡
    ");
            printf("		2、递推法:猴子吃桃子
    ");
            printf("		3、迭代法:斐波那契数列非递归求法
    ");
            printf("		4、迭代法:折纸超珠峰问题
    ");
            printf("		0、退出
    ");
            printf("		================================
    ");
            printf("请输入您的选择:");
            scanf("%d",&n);
            switch(n)
            {
                case 1:
                       count=0;
                       printf("
    某人有100元钱,要买100只鸡。公鸡5元钱一只,母鸡3元钱一只,小鸡一元钱3只。
    问可买到公鸡,母鸡,小鸡各为多少只?
    
    ");
                       for(x=1;x<=20;x++)
                       {
                                //
                            for(y=1;y<=33;y++)
                            {
                                for(z=1;z<=100;z++)
                                {
                                    if(x+y+z==100 && 5*x+3*y+z/3==100&& z%3==0)
                                    {
                                        count++;
                                         printf("第%d种情况:公鸡%d只,母鸡%d只,小鸡%d只
    ",count,x,y,z);
                                    }
                                }
                            }
                       }
                       break;
                case 2:
                       printf("有数量未知的桃子,猴子第一天吃了总数量的一半又多吃一个,
    第二天又吃了剩下的一半有多吃一个,依次类推,到第十天桃子的数量仅剩1个,
    问最初桃子的数量有多少?
    ");
                       while(day>1)
                       {
                           num=(num+1)*2;
                           day--;
                       }
                       printf("桃子的数量是:%d个
    ",num);
                        
                       break;
                case 3:
                       a=b=1;
                       printf("有一对兔子不吃不喝不会死,第三个月成熟,从成熟开始每月繁殖生下一对兔子,
    新生的每对兔子仍是第三个月成熟开始每月生一对兔子,那么每个月兔子的对数如何计算。
    其实这就是著名数列斐波那契数列如下:1 1 2 3 5 8 13 21 34 ......
    ");
                       printf("打印前20项的值:
    ");
                       printf("%d	%d	",a,b);
                       for(i=3;i<=20;i++)
                       {
                            c=a+b;
                            printf("%d	",c);
                            a=b;    
                            b=c;
                            if(i%5==0)
                            {
                                printf("
    ");
                            }
                       }
                       printf("
    ");
                       break;
                case 4:
                       printf("一张纸厚度是0.5mm厚,珠峰的高度为8848.43米,
    问这张纸对折多少次后会超过珠峰的高度?
    ");
                       while(h<8848.43)
                       {
                              h=h*2;
                              printf("%.3f	",h);
                              ci++;
                              if(ci%5==0)
                              {
                                     printf("
    ");
                              }
                              
                       }
                       printf("总计需要%d次后折纸超过珠峰的高度
    ",ci);
                       break;
                case 0:return;break;
                default:printf("输入有误
    ");break;
            }
        }
    }

    希尔法排序

    /* Note:Your choice is C IDE */
    #include "stdio.h"
    void main()
    {
      int i,tem,j;
        int arr[]={12,4,58,2,6,9,1,15,15,85,94,12,56};
        int num,n;//
        num=sizeof(arr)/sizeof(arr[0]);
    
        for(i=0;i<num;i++)
        {
            printf("%d    ",arr[i]);
        }
        printf("
    ");
        for(n=num/2;n>=1;n/=2){
        for(i=n;i<num;i++)//从第一个到长度-1
        {
             tem=arr[i];    
            for(j=i-n;arr[j]>tem&&j>=0;j=j-n){   
                 arr[j+n]=arr[j];
            }
                arr[j+n]=tem;
            }
      
        }
        for(i=0;i<num;i++)
        {
            printf("%d    ",arr[i]);
            }
    }

    递归

    #include <stdio.h>
    
    /* 交换两个数据 */
    void swap(char* a, char* b)
    {
        char c = *a;
        *a = *b;
        *b = c;
    }
    
    void perm(char str[], int index, int str_size)
    {
        int i = 0,j = 0;
    
        if(index == str_size)
        {
            /* 输出当前的排列 */
            for(i = 0; i < str_size; i++)
            {
                printf("%c ",str[i]);
            }
            printf("
    ");
        }
        else
        {
            for(j = index;j < str_size; j++)//每次进行自增后经过递归输出一次结果
            {
              printf("%d  %d
    ",j,index);
                swap(&str[j],&str[index]);
                perm(str,index+1,str_size);//递归指导index=str_size              
                swap(&str[j],&str[index]);//将交换后的给交换回来,避免重复
            }
        }
    }
    void main()
    {
        char a[] = "abc";
        perm(a,0,3);
    }

    披萨订购

    /* Note:Your choice is C IDE */
    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    char name[20];
    int p;//代表票数
    float Allprice=0.0;//总价
    void menu();
    void tickts();
    void groupby();
    void main()
    { 
        int bh;
        for(;;){
        menu();
        printf("请输入功能编号:");
        scanf("%d",&bh);
        switch(bh){
            case 1:tickts();break;
            case 2:groupby();break;
            case 0:exit(0);
            default :printf("您输入的编号有误!");break;
            }
        }
        
    }
    void menu(){
        printf("			==== 比格披萨 ===
    ");
        printf("			  1.普通票订购
    ");
        printf("			  2.团购票订购
    ");
        printf("			  0.退出
    ");
    }
    void tickts(){
        int i;//购票类型
        int p,p1,p2[4],p3;//张数
       
        char arr[20];
        printf("
    
    			===票务类型===
    ");
        printf("			1.成人票(65元/位)
    ");
        printf("			2.老人票(45元/位)
    ");
        printf("			3.儿童票(30元/位)
    ");
        /*票价*/
        p2[0]=0;
        p2[1]=65;
        p2[2]=45;
        p2[3]=30;
        printf("请输入订票您的姓名:");
        gets(name);gets(name);
        for(;;){
            
        printf("请选择票务类型:");
        scanf("%d",&i);
        printf("请选择票数:");
        scanf("%d",&p);
        if(i==1){
        strcpy(arr,"成人票");
        }else if(i==2){
        strcpy(arr,"老人票");
        }else if(i==3){
        strcpy(arr,"儿童票");
        }
        printf("顾客%s您好,您选择了:票务类型:%s  购票张数%d
    ",name,arr,p);
        Allprice+=Allprice;
        Allprice=(float)p2[i]*p;
        
        printf("信息确认请按:0/1");
        scanf("%d",&p1);
        if(p1==1){
            printf("核实信息后请支付票款%.2f元
    ",Allprice);
            printf("是否继续订票0/1:");
            scanf("%d",&p3);
            if(p3==1){
                Allprice=0;
                continue;
        }else if(p3==0){
        break;
        }else{
        printf("输入数字错误!");
        }
        }else if(p1==0){
        Allprice=0;
        continue;
        }else{
        printf("输入数字错误!");
        }
    }//循环
    }//最后
    void groupby(){
        float a,b;
        printf("输入团购票数");
        scanf("%d",&p);
        if(p<2){
            printf("两张起订
    ");
        }else if(p>2){
        Allprice=(float)p*60;
        printf("您需要支付%.2f",Allprice);
        a=Allprice-(int)Allprice%100+100;
        b=100-(int)Allprice%100;
        printf("如果您支付%.2f元,那么我找给你%.2f元
    ",a,b);
        
        }
        }

    斐波那契代码

    /*使用链表的方式来储存 */
    //标准的输出库
    #include "stdio.h"
    //字符串的操作类
    #include "string.h"
    //
    #include "stdlib.h"
    //定义全局步数
    int step=0;
    //m为盘子数,a,b,c分别为盘子名
    void move(int m,char a,char b,char c){
        if(m==1)
        {
            //第一步从a-c
            printf("第%d步move 1 from %c To %c
    ",step,a,c);
            step++;
        }else{
        //(1)Move(n-1,A,B,C),理解为将上面的n-1纸盘子作为一个整体从A经C移至B
            move(m-1,a,c,b);
            //此时的a和c并不是()里的a和c
            printf("第%d步move %d from %c To %c
    ",step,m,a,c);
            step++;
            
            move(m-1,b,a,c);
        }
    }
    void main()
    {
        char arr[]="hello world";
        //s->String  d->int c->char最好在前面加上一个空格 f->浮点型 
        move(3,'A','B','C');
    }
  • 相关阅读:
    连载日记
    自我介绍
    test0710 二分专题
    test0709 搜索专题
    test0705
    test0704
    [题解] [HNOI2015]落忆枫音
    test0606
    test0523
    备份
  • 原文地址:https://www.cnblogs.com/TimVerion/p/11193191.html
Copyright © 2011-2022 走看看