目录
[第二题:求10 个整数中最大值](#第二题:求10 个整数中最大值)
[1. 当n=1时,需要一步](#1. 当n=1时,需要一步)
[第十题 猜数字游戏(复习版本)](#第十题 猜数字游戏(复习版本))
[第十一题 二分查找(复习版)](#第十一题 二分查找(复习版))
第一题分数求和
计算1/1-1/2+1/3-1/4+1/5 ...... + 1/99 - 1/100 的值,打印出结果
- 将这个试子分成两部分,第一部分为1/1+1/3+1/5+....+1/99;第二部分1/2+1/4+.....1/100
- 然后将这两个试子相减
- 注意这里分数是浮点型
- double型是长整型浮点型
cpp
//分数求和
int main() {
double sum = 0.0;
double sub = 0.0;
double acc = 0.0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
sum += (1.0 / i);
}
else {
sub += (1.0 / i);
}
}
acc = sub - sum;
printf("%lf", acc);
第二题:求10 个整数中最大值
第三题:在屏幕上输出9*9乘法口诀表
第四题:写一个代码:打印100~200之间的素数
第五题:求斐波那契数的第N个数
斐波那契数的概念:前两个数相加等于第三个数
1 1 2 3 5 8 13 21 34 55
斐波那契数的公式:
当N<=2时 Fib(N)= 1;
当N>3时, Fib(N)=Fib(N-2)+Fib(N-1);2
cpp
//求斐波那契数列的第N个数
int Fib(int n) {
if (n <= 2) {
return 1;
}
else {
return Fib(n - 1) + Fib(n - 2);
}
}
int main() {
int n = 0;
scanf("%d", &n);
int sum = Fib(n);
printf("第%d个数为:%d\n", n,sum);
return 0;
}
第六题:汉诺塔游戏
思路:
1. 当n=1时,需要一步
2.当n=2时,需要三步
3.当n=3时,需要七步
这里我们发现为了实现第四步,是完成了n=2的所有步骤3步。若将黑红当一个整体。
那么我们要实现最后一步是不是也是完成相同的操作即n=2时的操作。
总结一下
首先,是完成一次n=2时的操作 即(n-1)时操作的操作。
在加上一步将蓝色放入第三根柱子的操作
最后,是将黑红当一个整体,在完成一次n=2即(n-1)时的操作。
公式结论
汉诺塔公式为:
当n=1时 要1步
当n>1时 要 2*(n-1)+1步
cpp
//汉诺塔游戏
int Hanoi(int n) {
if (n == 1) {
return 1;
}
else {
return 1 + 2 * Hanoi(n - 1);
}
}
int main() {
int n = 0;
scanf("%d", &n);
int sum = Hanoi(n);
printf("需要%d步", sum);
return 0;
}
第七题:青蛙跳台阶问题
问题:青蛙一次可以跳一个台阶,也可以一次跳2个台阶。请问如果有n个台阶时,青蛙有几种方法
|-----|--------------------------|---------------|-------------|
| 台阶数 | 第一次跳一格 | 第一次跳两格 | 方法数 |
| 1 | 1 | | 1 |
| 2 | 1 1 | 2 | 2 |
| 3 | 111;12 | 21 | 3 |
| 4 | 1111;121;112 | 22;211 | 5 |
| 5 | 11111;1211;1121;1112;122 | 2111;221;212; | 8 |
| n | n-1 | n-2 | (n-1)+(n-2) |
cpp
//青蛙跳台游戏
int fac(int n) {
if (n == 1) {
return 1;
}
else if(n==2) {
return 2;
}else{
return fac(n-1)+fac(n-2);
}
}
int main() {
int n = 0;
scanf("%d", &n);
int sum = fac(n);
printf("需要%d步", sum);
return 0;
}
第八题数9的个数
数100以内的出现过9的数字
cpp
//数9的个数
int main() {
int n = 1;
while (n <= 100)
{
if (n % 10 == 9) {
printf("%d ", n);
}
else if(n / 10 == 9) {
printf("%d ", n);
}
n++;
}
return 0;
}
第十题 猜数字游戏(复习版本)
易错点:
- srand((unsigned int)time(NULL));随机数种子,不能放在while循环里,要不然每次输入数字,都会生成随机的种子,会导致永远猜不对数字。
2.scanf("%d", &n);要放在循环里,要不然每次上一次猜对的数会一直在循环里循环。
cpp
//猜数字游戏
void menu() {
printf("*******************\n");
printf("*******0 结束******\n");
printf("*******1 开始******\n");
printf("*******************\n");
printf("输入0/1\n");
}
int fac(int n) {
srand((unsigned int)time(NULL));
int nnn = rand()%100+1;
return nnn;
}
int main() {
menu();
int n = 0;
int nn = 0;
scanf("%d", &nn);
srand((unsigned int)time(NULL));
if (nn == 1) {
int sum = fac(n);
while (1) {
printf("输入你猜的数字:");
scanf("%d", &n);
if (n < sum)
{
printf("猜小了\n");
}
else if (n > sum)
{
printf("猜大了\n");
}
else
{
printf("猜对了");
break;
}
}
}
else {
printf("结束游戏");
}
return 0;
}
第十一题 二分查找(复习版)
编写代码在一个整形有序数组中查找具体的某个数
要求:找到了就打印数字所在的下标,找不到则输出:找不到。
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//二分查找
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sum = sizeof(arr) / sizeof(arr[0]);
printf("数组有%d个\n", sum);
int left = 0;
int right = sum - 1;
int n = 0;
printf("请输入你要查找的数:");
scanf("%d", &n);
while (n)
{
int mid = (left + (right - left)) / 2;
if (n < arr[mid])
{
right = mid - 1;
}
else if (n > arr[mid])
{
left = mid + 1;
}
else
{
printf("找到了下标为:%d", arr[n]);
break;
}
}
return 0;
}