面试常见必会的几个算法--水仙花、猴子吃桃、生兔子

算法举例:

水仙花

水仙花数:水仙花数是三位数,它的各位数字的立方和等于这个三位数本身,例如:370=33+73+00;371=33+73+13,370、371就是一个水仙花数
注意:要判断一个三位数是不是水仙花数,得先取得这个三位数的的个位,十位和百位

C语言
#include<stdio.h>
int main()
{
	int b,s,g,n; //n是水仙花数
	printf("水仙花数是:\n");
	for(n=100;n<1000;n++)
	{  
		b=n/100; /*分解出百位*/ 
		s=n/10%10; /*分解出十位*/
		g=n%10; /*分解出个位*/
		if(b*100+s*10+g==b*b*b+s*s*s+g*g*g)  //水仙花数判定
		{
			printf("%d\n",n); //输出符合条件的数
		}
	}
}
Java语言
public class Daffodil {
  public static void main(String[] args) {
    int count = 0;    //定义水仙花数的个数
    for(int i=100;i<=10000;i++){ //水仙花数范围
      int b = i/100;    //取得百位数
      int s = (i-100*b)/10;    //取得十位数
      int g = (i-s*10-b*100);    //取得个位数
      
      if(i==g*g*g+s*s*s+b*b*b){ //水仙花数判定
        System.out.print(i+" ");  //输出符合条件的数
        count++;
      }
    }
    System.out.println();    //换行
    System.out.println("水仙花数总共有"+count+"个");  //输出水仙花数的总数
  }
}

注:主要有三种方式包括普通for循环、while循环以及do-while循环

猴子吃桃

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
问题分析:按照题意,猴子们每天吃桃子的一半,小猴子再偷吃一个,等于每天都吃前一天剩余桃子的一半加一个,知道第十天只剩一个桃子。

C语言
迭代法
注:forwhile均可循环实现
#include<stdio.h>
#include <stdlib.h>
int main()
{
	int peach = 0;//桃子总数
	int rest = 1;//第10 天只剩一个桃子
	int day = 9;
	while(day--)
	{
		peach = (rest + 1) * 2;//每天的桃子总数是后一天剩余桃子加1乘2
		rest = peach;
	}
	printf("猴子第一天一共摘了%d个桃子\n",peach);
	system("pause");
	return 0;
}
递归核心实现
int total_peach(int rest)
{
    return (rest+1)*2;
}
while(day--)
	{
		peach = total_peach(rest);//递归实现
		rest = peach;
	}
Java语言
public class MonkeyEating  {
    public static void main(String[] args) {
        int x = 1; //初始为1
        for (int i = 2; i <= 10; i++) {
            //第二天的数量为第一天数量的一半减一  y = x/2 - 1
            //反过来说第一天是第二天的数量加一的两倍  2y = x -2  x = 2y +2 = 2*(y + 1)
            x = (x + 1) * 2; //若干个桃子数计算公式
        }
        System.out.println("猴子第一天摘了" + x + "个桃子");
    }
}
兔子记数

现有一对兔子,每一对兔子每个月都会生一对小兔子,小兔子在月龄达到第三个月开始每个月就可以生一对,兔子不会出现生老病死,经过一年,每个月兔子总数有多少对?

		1、分析:兔子规律数:1,1,2,3,5,8,13,21……
		2、斐波那契数列小代码
		              f1=f1+f2;          
		              f2=f1+f2;            //斐波那契数列规律
C语言
 include<stdio.h>
int main()
{
	long int f1,f2;     
	int i;
	f1=f2=1;
	for(i=1;i<=20;i++)
	{
		printf("%12d %12d",f1,f2);
			if(i%2==0)	
		    printf("\n");     //四个一行打印(一次打印两个,两次循环打印四个)
			f1=f1+f2;          
			f2=f1+f2;            //斐波那契数列规律
	}
	return 0;
}
Java语言
每月的兔子总数就是:前一个月的兔子总数+这个月出生的兔子总数
public class rabbit {
	public static void main(String ards[]){
		int i,a=1,b=1,c=0,M=24;
		//前两个月手动输出,第三个月开始进入规律
		System.out.println("第1个月有1对兔子");
		System.out.println("第2个月有1对兔子");
		/*可理解为
		a是任意一个月的兔子对数,b是a的下一个月的兔子对数,
		令c=a+b,那么c就是b的下一个月的兔子对数
		一个循环结束,a来到了上一轮b的位置,b来到了c的位置,
		那么a+b又可以算出后面的对数了
		*/
		for(i = 3;i<M;i++){
			c = a + b;
			a = b;
			b = c;
			System.out.println("第"+i+"个月有"+c+"对兔子");
		}	
	}
}

总结
(1) 实例分析
循环的嵌套是指在一个循环体内又包含了另一个完整的循环。循环的嵌套执行过程是外循环执行一次,内循环执行一次,在内循环结束后,再执行下一次外循环,如此反复,直到外循环结束。

(2) 循环的嵌套注意事项:
① 循环必须完全包含内循环,不能交叉;
② 在多重循环中,各层循环的循环控制变量不能同名;
③ 在多重循环中,并列循环的循环控制变量名可以相同,也可以不同。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值