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("\t\t==========经典算法==============\n");
        printf("\t\t1、穷举法:百钱买百鸡\n");
        printf("\t\t2、递推法:猴子吃桃子\n");
        printf("\t\t3、迭代法:斐波那契数列非递归求法\n");
        printf("\t\t4、迭代法:折纸超珠峰问题\n");
        printf("\t\t0、退出\n");
        printf("\t\t================================\n");
        printf("请输入您的选择:");
        scanf("%d",&n);
        switch(n)
        {
            case 1:
                   count=0;
                   printf("\n某人有100元钱,要买100只鸡。公鸡5元钱一只,母鸡3元钱一只,小鸡一元钱3只。\n问可买到公鸡,母鸡,小鸡各为多少只?\n\n");
                   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只\n",count,x,y,z);
                                }
                            }
                        }
                   }
                   break;
            case 2:
                   printf("有数量未知的桃子,猴子第一天吃了总数量的一半又多吃一个,\n第二天又吃了剩下的一半有多吃一个,依次类推,到第十天桃子的数量仅剩1个,\n问最初桃子的数量有多少?\n");
                   while(day>1)
                   {
                       num=(num+1)*2;
                       day--;
                   }
                   printf("桃子的数量是:%d个\n",num);
                    
                   break;
            case 3:
                   a=b=1;
                   printf("有一对兔子不吃不喝不会死,第三个月成熟,从成熟开始每月繁殖生下一对兔子,\n新生的每对兔子仍是第三个月成熟开始每月生一对兔子,那么每个月兔子的对数如何计算。\n其实这就是著名数列斐波那契数列如下:1 1 2 3 5 8 13 21 34 ......\n");
                   printf("打印前20项的值:\n");
                   printf("%d\t%d\t",a,b);
                   for(i=3;i<=20;i++)
                   {
                        c=a+b;
                        printf("%d\t",c);
                        a=b;    
                        b=c;
                        if(i%5==0)
                        {
                            printf("\n");
                        }
                   }
                   printf("\n");
                   break;
            case 4:
                   printf("一张纸厚度是0.5mm厚,珠峰的高度为8848.43米,\n问这张纸对折多少次后会超过珠峰的高度?\n");
                   while(h<8848.43)
                   {
                          h=h*2;
                          printf("%.3f\t",h);
                          ci++;
                          if(ci%5==0)
                          {
                                 printf("\n");
                          }
                          
                   }
                   printf("总计需要%d次后折纸超过珠峰的高度\n",ci);
                   break;
            case 0:return;break;
            default:printf("输入有误\n");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("\n");
    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("\n");
    }
    else
    {
        for(j = index;j < str_size; j++)//每次进行自增后经过递归输出一次结果
        {
          printf("%d  %d\n",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("\t\t\t==== 比格披萨 ===\n");
    printf("\t\t\t  1.普通票订购\n");
    printf("\t\t\t  2.团购票订购\n");
    printf("\t\t\t  0.退出\n");
}
void tickts(){
    int i;//购票类型
    int p,p1,p2[4],p3;//张数
   
    char arr[20];
    printf("\n\n\t\t\t===票务类型===\n");
    printf("\t\t\t1.成人票(65元/位)\n");
    printf("\t\t\t2.老人票(45元/位)\n");
    printf("\t\t\t3.儿童票(30元/位)\n");
    /*票价*/
    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\n",name,arr,p);
    Allprice+=Allprice;
    Allprice=(float)p2[i]*p;
    
    printf("信息确认请按:0/1");
    scanf("%d",&p1);
    if(p1==1){
        printf("核实信息后请支付票款%.2f元\n",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("两张起订\n");
    }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元\n",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\n",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\n",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');
}

 

转载于:https://www.cnblogs.com/TimVerion/p/11193191.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值