百钱买百鸡(百钱百鸡,百鸡问题)
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
实现过程:
(1) 使用 for 语句对 3 种鸡的数嫌在事先确定好的范围内进行穷举并判断,对满足条件的 3 种鸡的数量按指定格式输出,否则进行下次循环。
#include <stdio.h>
int main()
{
int cock,hen,chick; /*定义变童为基本整型*/
for(cock=0;cock<=20;cock++) /*公鸡范围在 0~20 之间*/
for(hen=0;hen<=33;hen++) /*母鸡范围在 0~33 之间*/
for(chick=3;chick<=99;chick++) /*小鸡范围在 3~99 之间*/
if(5*cock+3*hen+chick/3==100) /*判断钱数是否等于 100*/
if(cock+hen+chick==100) /*判断购买的鸡数是否等于 100*/
if(chick%3==0) /*判断小鸡数是否能被 3 整除*/
printf("公鸡:%d,母鸡:%d,小鸡:%d\n",cock,hen,chick);
return 0;
}
渔夫打鱼晒网问题
如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。
实现过程:
(1) 自定义函数 leap(),用来判断输入的年份是否是闰年。
(2) 自定义函数 number(),用来计算输入日期距 2011 年 1 月 1 日共有多少天。
(3) main() 函数作为程序的入口函数,在 main() 函数中调用上面两个函数。程序代码如下:
判断闰年
判断任意年份是否为闰年,需要满足以下条件中的任意一个:
① 该年份能被 4 整除同时不能被 100 整除;
② 该年份能被400整除。
本实例中使用嵌入式 if-else 语句。
#include <stdio.h>
int main()
{
int year,a;
printf("请输人年份:\n");
scanf("%d",&year);
if(year%400==0)
a=1;
else
{
if(year%4==0&&year%100!=0)
a=1;
else
a=0;
}
if(a==1)
{
printf("%d 此年是闰年\n",year);
}
else
{
printf("%d 此年非闰年\n",year);
}
return 0;
}
兔子生兔子问题
假设一对兔子的成熟期是一个月,即一个月可长成成兔,那么,如果每对成兔每个月都生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,以后每个月会有多少对兔子?
#include <stdio.h>
int main()
{
int i,tu1,tu2,tu3,m;
tu1=1;
tu2=1;
printf("请输入月份数\n");
scanf("%d",&m);
if(m==1||m==2)
{
printf("有一对兔子");
}
else
{
for(i=3;i<=m;i++)
{
tu3=tu1+tu2;
tu1=tu2;
tu2=tu3;
}
printf("%d 月的兔子数为:%d\n",m,tu3);
}
return 0;
}
狼追兔子问题
一只兔子躲进了 10 个环形分布的洞的某一个,狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找,也没有找到,就隔两个洞,到第六个洞去找,以后每次多隔一个洞 去找兔子……这样下去,结果一直找不到兔子,请问:兔子可能躲在哪个洞中?
算法思想
对于本实例中提到的问题,虽然是“兔子可能躲在哪个洞中”,但是在考虑算法时,需要知道的是狼会去哪个洞找兔子,狼第一次去的洞是第一个(表示为 pos1),第二次去的是第三个(pos3),把它去的洞的代码用数字表示出来,可以推导出狼去的洞的代码是: pos(i+1)=pos(i)+i+1。
由题目可知,狼没有找到兔子,因此该算法会一直持续下去。除此之外,还需要注意的是,在 10 个洞之后,比如狼去找第十五个洞,但第十五个洞是不存在的,因此我们用 15 对 10 求余,得到的数字才是洞的标示。
#include <stdio.h>
int main()
{
int i;
int pos[10]={
0};
int lang=0;
for(i=0;i<100;i++)
{
pos[lang]=1;
lang++;
lang+=i;
lang=lang%10;
}
for(i=0;i<10;i++)
{
if(!pos[i])
{
printf("兔子可能在第%d洞中\n",i+1);
}
}
return 0;
}
求完数(完全数)
如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而 6=1+2+3,因此6是“完数”。
#include <stdio.h>
int main()
{
int n;
int s;//和
int i,j;
printf("请输入所选范围上限:");
scanf("%d", &n); /* n的值由键盘输入*/
for(i=2;i<=n;i++ )
{
s=0;
for(j=1;j<i;j++)
{
if(i%j==0)
{
s+=j;
}
}
if(s == i) /*判断因子这和是否和原数相等*/
printf("It's a perfect number:%d\n", i);
}
return 0;
}
求亲密数(详解版)
#include<stdio.h>
int main()
{
int a, i, b, n;
printf("There are following friendly--numbers pair smaller than 3000:\n");
for( a=1; a<3000; a++ ) /*穷举3000以内的全部整数*/
{
for( b=0, i=1; i<=a/2; i++) /*计算数a的各因子,各因子之和存放于b*/
if(!(a%i))
b+=i;
for( n=0, i=1; i<=b/2; i++ ) /*计算b的各因子,各因子之和存于n*/
if(!(b%i))
n+=i;
if(n==a && a<b) /*使每对亲密数只输出一次*/
printf("%4d--%4d ", a, b); /*若n=a,则a和b是一对亲密数,输出*/
}
return 0;
}
求回文数(详解版)
打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。
#include<stdio.h>
int main()
{
int m[16], n, i, t, count=0;
long unsigned a, k;
printf("No. number it's square(palindrome)\n");
for( n=1; n<256; n++ ) /*穷举n的取值范围*/
{
k=0; t=1; a=n*n; /*计算n的平方*/
for( i=0; a!=0; i++ ) /*从低到高分解数a的每一位存于数组m[1]~m[16]*/
{
m[i] = a % 10;
a /= 10;
}
for(; i>0; i--)
{
k += m[i-1] * t; /*t记录某一位置对应的权值 */
t *= 10;
}
if(k == n*n)
printf("%2d%10d%10d\n", ++count, n, n*n);
}
return 0;
}