猴子吃桃
猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃一个,以后每天早上都吃了前一天剩下的一半零一个到底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;
}
总结
算法实在太难了,搞不明白。