C语言趣味编程100例 是学习路上必不可缺的示例,话不多说直接看代码
1,百钱百鸡问题
include<stdio.h>
main()
{
int cock,hen,chicken;
for(cock=0;cock<=20;cock++) /外层循环控制公鸡数量取值范围0~20/
for(hen=0;hen<=33;hen++) /内层循环控制母鸡数量取值范围0~30/
for(chicken=0;chicken<=100;chicken++)
/内层循环控制小鸡数量取值范围0~100/
{
if((5cock+3hen+chicken/3.0100)&&(cock+hen+chicken100))
/在内外层循环条件控制下小鸡数量的取值限制用难一组解的合理性/
printf("cock=%2d,hen=%2d,chicken=%2d\n",cock,hen,chicken);
}
}
2,借书方案知多少
include<stdio.h>
main()
{
int a,b,c,i=0; /a,b,c分别用来记录三个人所选新书编号,i用来控制有效借阅次数/
printf("A,B,C三人所选书号分别为:\n");
for(a=1;a<=5;a++) /用来控制A借阅图书编号/
for(b=1;b<=5;b++) /用来控制B借阅图书编号/
for(c=1;c<=5;c++) /用来控制C借阅图书编号/
if(a!=b&&a!=c&&c!=b) /此条件用来控制有效借阅组合/
{printf("A:%2d B:%2d c:%2d ",a,b,c);
i++;
if(i%4==0)printf("\n");} /每行最多输出4种借阅方法组合/
printf("共有%d种有效借阅方法\n",i); /输出有效的借阅方法总数/
}
3,打鱼还是晒网
include<stdio.h>
/定义日期结构体/
typedef struct date {
int year;
int month;
int day;
}DATE;
int countDay(DATE); /函数声明/
int runYear(int); /函数声明/
void main()
{
DATE today; /指定日期/
int totalDay; /指定日期距离1990年1月1日的天数/
int result;/totalDay对5取余的结果/
/输入指定日期,包括年,月,日/
printf("please input 指定日期 包括年,月,日 如:1999 1 31\n");
scanf("%d%d%d",&today.year,&today.month,&today.day);
/求出指定日期距离1990年1月1日的天数/
totalDay=countDay(today);
/天数%5,判断输出打鱼还是晒网/
result=totalDay%5;
if(result>0&&result<4)
printf("今天打鱼");
else
printf("今天晒网");
}
/判断是否为闰年,是返回1,否返回0/
int runYear(int year)
{
if((year%40&&year%100!=0)||(year%4000)) /是闰年/
return 1;
else
return 0;
}
/计算指定日期距离1990年1月1日的天数/
int countDay(DATE currentDay)
{
int perMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30}; /每月天数数组/
int totalDay=0,year,i;
/求出指定日期之前的每一年的天数累加和/
for(year=1990;year<currentDay.year;year++)
{
if(runYear(year)) /判断是否为闰年/
totalDay=totalDay+366;
else
totalDay=totalDay+365;
}
/如果为闰年,则二月份为29天/
if(runYear(currentDay.year))
perMonth[2]+=1;
/将本年内的天数累加到totalDay中/
for(i=0;i<currentDay.month;i++)
totalDay+=perMonth[i];
/将本月内的天数累加到totalDay中/
totalDay+=currentDay.day;
/返回totalDay/
return totalDay;
}
4, 抓交通肇事犯
include<stdio.h>
void main()
{
int i,j,k,temp; /i代表前两位车牌号数字,j代表后两位车牌号的数字,k代表车牌号/
for(i=0;i<=9;i++)
for(j=0;j<=9;j++) /穷举前两位和后两位车牌数字/
{
/判断前两位数字和后两位数字是否不同/
if(i!=j)
{
/组成4位车牌号k/
k=1000i+100i+10j+j;
/判断k是否是某个数的平方,若是则输出k/
for(temp=31;temp<=99;temp++)
if(temptemp==k)
printf("车牌号为%d",k);
}
}
}
5,兔子产子问题
include<stdio.h>
void main()
{
long fib1=1,fib2=1,fib;
int i;
printf("%12ld%12ld",fib1,fib2); /输出第一个月和第二个月的兔子数/
for(i=3;i<=30;i++)
{
fib=fib1+fib2; /迭代求出当前月份的兔子数/
printf("%12d",fib); /输出当前月份兔子数/
if(i%4==0)
printf("\n"); /每行输出4个/
fib2=fib1; /为下一次迭代作准备,求出新的fib2/
fib1=fib; /求出新的fib1/
}
}
6,牛顿迭代法求方程根
include<stdio.h>
include<math.h>
main()
{
float solution(float a,float b,float c,float d); /函数功能是用牛顿迭代法求方程的根/
float a,b,c,d,x; /a,b,c,d代表所求方程的系数,x用来记录求得的方程根/
printf("请输入方程的系数:");
scanf("%f %f %f %f",&a,&b,&c,&d);
x=solution(a,b,c,d);
printf("所求方程的根为x=%f",x);
}
float solution(float a,float b,float c,float d)
{
float x0,x=1.5,f,fd,h; /f用来描述方程的值,fd用来描述方程求导之后的值/
do
{
x0=x; /用所求得的x的值代替x0原来的值/
f=ax0x0x0+bx0x0+cx0+d;
fd=3ax0x0+2bx0+c;
h=f/fd;
x=x0-h; /求得更接近方程根的x的值*/
}while(fabs(x-x0)>=1e-5);
return x;
}
7,最佳存款方案
include<stdio.h>
main()
{
int i;
double money=0.0;
for(i=0;i<5;i++)
money=(money+1000.0)/(1+0.006312);
printf("应存入的钱数为:%0.2f\n",money); /结果保留两位小数*/
}
8,冒泡排序
include<stdio.h>
define N 10 /因数组的大小不确定,所以采用宏定义的方式,数组大小改变时只需改变N对应的值不需要改动程序/
main()
{
int i,j,a[N],t,count=0;
printf("请为数组元素赋初值:\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=1;i<=N-1;i++) /控制比较的轮数/
for(j=0;j<N-i;j++) /控制每轮比较的次数/
if(a[j]>a[j+1]) /数组相邻两个元素进行交换/
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
printf("经过交换后的数组元素为:\n");
for(i=0;i<N;i++)
{
count++;
printf("%d ",a[i]);
if(count%5==0) /控制每行输出5个数/
printf("\n");
}
printf("\n");
}
9,折半查找
include <stdio.h>
define N 10
main()
{
int i,a[N]={-3,4,7,9,13,45,67,89,100,180 },low=0,high=N-1,mid,k=-1,m;
printf("a数组中的数据如下:\n");
for(i=0;i<N;i++)
printf("%d ", a[i]); /输出数组中原数据序列/
printf("\n");
printf("Enter m: ");
scanf("%d",&m); /由键盘输入要查找的整数值/
while(low<=high) /继续查找的控制条件/
{
mid=(low+high)/2; /确定指针mid的位置/
if(m<a[mid])
high=mid-1;
else
if(m>a[mid])
low=mid+1;
else
{
k=mid;
break; /一旦找到所要查找的元素便跳出环/
}
}
if(k>=0)
printf("m=%d,index=%d\n",m,k);
else
printf("Not be found!\n");
}
10,数制转换
include <stdio.h>
define MAXCHAR 101 /最大允许字符串长度/
int char_to_num(char ch); /返回字符对应的数字/
char num_to_char(int num); /返回数字对应的字符/
long source_to_decimal(char temp[],int source); /返回由原数转换成的10进制数/
int decimal_to_object(char temp[],long decimal_num,int object); /返回转换成目标数制后字符数组的长度/
void output(char temp[],int length); /将字符数组逆序打印/
main()
{
int source; /存储原数制/
int object; /存储目标数制/
int length; /存储转换成目标数制后字符数组的长度/
long decimal_num; /存储转换成的10进制数/
char temp[MAXCHAR]; /存储待转换的数值和转换后的数值/
int flag=1; /存储是否退出程序的标志/
while(flag) /利用输入的flag值控制循环是否结束/
{
printf("转换前的数是:");
scanf("%s",temp);
printf("转换前的数制是:");
scanf("%d",&source);
printf("转换后的数制是:");
scanf("%d",&object);
printf("转换后的数是:");
decimal_num=source_to_decimal(temp,source);
length=decimal_to_object(temp,decimal_num,object);
output(temp,length);
printf("继续请输入1,否则输入0:\n");
scanf("%d",&flag);
}
}
/将字符转换成数字/
int char_to_num(char ch)
{
if(ch>='0'&&ch<='9')
return ch-'0'; /将数字字符转换成数字/
else
return ch-'A'+10; /将字母字符转换成数字/
}
char num_to_char(int num)
{
if(num>=0&&num<=9)
return (char)('0'+num-0); /将0~9之间的数字转换成字符/
else
return (char)('A'+num-10); /将大于10的数字转换成字符/
}
long source_to_decimal(char temp[],int source)
{
long decimal_num=0; /存储展开之后的和/
int length;
int i;
for(i=0;temp[i]!='\0';i++);
length=i;
for(i=0;i<=length-1;i++) /累加/
decimal_num=(decimal_numsource)+char_to_num(temp[i]);
return decimal_num;
}
int decimal_to_object(char temp[],long decimal_num,int object)
{
int i=0;
while(decimal_num)
{
temp[i]=num_to_char(decimal_num%object); /求出余数并转换为字符/
decimal_num=decimal_num/object; /用十进制数除以基数/
i++;
}
temp[i]='\0';
return i;
}
void output(char temp[],int length)
{
int i;
for(i=length-1;i>=0;i--) /输出temp数组中的值*/
printf("%c",temp[i]);
printf("\n");
}