重要算法一览
#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'); }