C语言算法题2

百钱买百鸡(百钱百鸡,百鸡问题)

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
实现过程:
(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;
}

水仙花数(详解版)

Guess you like

Origin blog.csdn.net/weixin_51552144/article/details/121132738