C语言经典算法题

猴子吃桃

在这里插入图片描述

猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃一个,以后每天早上都吃了前一天剩下的一半零一个到底10天早上想再吃是,见只剩下一个桃子,求第一天共有多少桃子

方法一:逆向思维

#include<stdio.h>
#include <stdlib.h>
int main()
{
	int a = 1, n;//n天数,a桃子
	scanf("%d", &n);
	for (int i = 1; i <= n - 1; i++)
	{
		a = a + 1;
		a = 2 * a;
	}
	printf("%d", a);
	system("pause");
	return 0;
}

方法二:递归方法

#include<stdio.h>
#include<stdlib.h>
int b(int n);
int main()
{
	int sum = b(1);
	printf("第一天摘了:%d桃子\n", sum);
	system("pause");
	return 0;
}
int b(int n)
{
	int sum;//桃子数
	if (n == 10)
		return 1;
	else
	{
		sum = (b(n + 1) + 1) * 2;
		printf("第%d天所剩桃子%d\n", n, sum);
	}
	return sum;
}

加密电文

有一类加密电文,按照下图的加密规则翻译成密码,要求实现把此类密码翻译回原文。 例如:密码abc456MNO翻译回原文为zyx543NML
A->Z,B->Y,C->X……M->N Z->A,Y->B……N->M 0->9,1->8,2->7……4->5
9->0,8->1……5->4 a->z,b->y,c->x……m->n z->a,y->b……n->m

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char c[20];
	printf("请输入密码:");
	scanf("%s", &c);
	for (int i = 0; c[i] != '\0';i++)
	{
		if (c[i] >= '0' &&c[i] <= '9')
			c[i] = '9' - c[i]+'0';
		else if (c[i] >= 'a'&&c[i] <= 'z')
			c[i] = 'z' - c[i] + 'a';
		else
			c[i] = 'Z' - c[i] + 'A';
	}
	printf(" 原文件为 :");
	printf("%s\n", c);
	system("pause");
	return 0;
}

自由落体

一球从M米高度自由下落,每次落地后返回原高度的一半,在落下, 他在第N次落下时反弹多高?共经过多少米?保留两位小数、

方法一

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int N;
	double gao=0,sum=0,M;
	scanf("%lf %d", &M, &N);//高度 第几次落下
	gao = M;
	for (int i = 0; i < N; i++)//次数
	{
		sum  += 2 * gao;
		gao = gao / 2;
	}
	printf("%0.2lf %0.2lf", gao, sum-M);
	system("pause");
	return 0;
}

方法二

#include<stdio.h>
#include<stdlib.h>
int main()
{
	float i, a, b;
	float sum = 0;
	scanf("%f%f", &a, &b);
	for (i = 0; i<b; i++)
	{
	    sum = sum + a;//第一次(下降) 
		a = a / 2;//折半 
		sum = sum + a;// 第二次(上升) 
	}
	sum = sum - a;//是因为最后一次的时候只算到落地
	printf("%.2f %.2f", a, sum);
	system("pause");
	return 0;
}

亲密数

求亲密数 如果一个数A的全部因子之和等于B且B的全部因子等于A 那么这两个数就互称为亲密数。因子:6的y因子为,1,2,3

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a, b, t, i; //求出a的全部因子累加和记为b,求出b的全部因子累加和记为t,判断a是否等于t。
	printf("3000以内的亲密数:\n");
	for (a = 1; a <= 3000; a++)
	{
		for (b = 0, i = 1; i <= a / 2; i++)//找因子
		{
			if (a%i == 0)
			{
				b += i;//整数a的因子之和
			}
		}
		for (t = 0, i = 1; i <= b / 2; i++)//找因子
		{
			if (b%i == 0)
			{
				t += i;//整数a的因子之和
			}
		}
		if (t == a&&a < b)
		{
			printf("%d %d\n",a,b);
		}
	}
	system("pause");
	return 0;
}

数字位数

给出一个不多于5位的整数,
要求 1、求出它是几位数
2、分别输出每一位数字
3、按逆序输出各位数字,
例如原数为321,应输出123

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int num[5], n, number = 0;//定义一个有 5 个元素的数组,number记录数位
	scanf("%d", &n);
	for (int i = 0; i < 5; i++)
	{
		if (n == 0)break;//如果输入的数为 0 则退出这个循环
		else
		{
			num[i] = n % 10;//获取最后一位数,num[0] 为最后一个数,num[1] 是倒数第二个数
			n = n / 10;//n 向前进 1 位,无小数点
			number++;
		}
	}
	printf("%d\n",number);  //输出数位
	for (int i = number - 1; i >= 0; i--) {
		if (i != 0) {  //如果 num[i] 不是最后一个数,则加一个空格
			printf("%d ",num[i]);
		}
		else printf("%d",num[i]);  //输出最后一个数
	}
	printf("\n");  //换行
	for (int i = 0; i < number; i++) {
	printf("%d", num[i]);  //按照 num[i] 顺序输出
	}printf("\n");
	system("pause");
	return 0;
}

百元买鸡

百钱买百鸡 公鸡 5块钱一个 母鸡 3块钱一个 小鸡3个一块钱 我们要用100块买100只鸡

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i, j, k;
	printf("百元买百鸡的所有解如下所示:\n");
	for (i = 0; i <= 100; i++)//公鸡数
	for (j = 0; j <= 100; j++)//母鸡数
	for (k = 0; k <= 100; k++)//小鸡数
	{
		if (5 * i + 3 * j + k / 3 == 100 && i + j + k == 100 && k % 3 == 0)
			printf("公鸡%2d只,母鸡%2d只,小鸡%2d只\n", i, j, k);
	}
	system("pause");
	return 0;
}

5友捕鱼

一个人先醒,将鱼平分5份,正好多一条,然后扔进河里,拿了一份走了.
又一个人醒,将鱼平分5份,正好多一条,然后扔进河里,拿了一份走了.
类推 问:至少共捕几鱼

#include<stdio.h>
#include<stdlib.h>
#define f 2
int fish(int n, int m)//两个人 至少要多少条鱼 7=3*2+1 3
{
	if (m == 0 && n >= f - 1) return m;
	else                 //最后一个人看见了可以分的鱼 平分f份正好多一条
	if (n % f == 1)//平分5份后正好剩一条
		return fish((n - 1) / f * (f - 1), --m);
	else return -1;//否则退出
}
int main()
{
	for (int n = 1;; n += f)
	if (fish(n, f) == 0)//如果返回值是0,就是满足情况的最小的鱼数
	{
		printf("%d", n);//输出数目
		break;//跳出循环
	}
	system("pause");
	return 0;
}

奶牛生子

奶牛生子, 一只刚出生的奶牛,到第四年就会生一只小奶牛,后面每年都会生一只. 问:20年后有多少只奶牛?

#include<stdio.h>
#include<stdlib.h>
int num(int n);//参数n 年数
int main()
{
	printf("%d\n", num(20));
	system("pause");
	return 0;
}
int num(int n)//参数n 年数
{
	int m;//年数
	int sum = 1;//数量
	for (m = 1; m <= n;m++)//循环分支结构
	{
		if (m >= 4)//前三年不能生 //到第四年就会生一只
		{ 
			if (n - m >= 4)//递归一层一层进 一层一层出
				sum += num(n - m);//具有够生小牛的时间 num(16)
			else//后面每年都会生一只
		        sum++;//生的牛不足4年//num(3)
		}
	}//sum等于 1+num(20-4)+num(20-5)+....
	return sum;
}

总结

算法实在太难了,搞不明白。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45893999/article/details/106387711