/*
设计一个函数,用来计算b的n次方
递归的2个条件:
1.函数自己调用自己
2.必须有个明确的返回值
*/
#include <stdio.h>
int pow2(int b, int n);
int main()
{
int c = pow2(3, 2);
printf("%d\n", c);
return 0;
}
/*
pow2(b, 0) == 1
pow2(b, 1) == b == pow2(b, 0) * b
pow2(b, 2) == b*b == pow2(b, 1) * b
pow2(b, 3) == b*b*b == pow2(b, 2) * b
1> n为0,结果肯定是1
2> n>0,pow2(b, n) == pow2(b, n-1) * b
*/
int pow2(int b, int n)
{
if (n <= 0) return 1;
return pow2(b, n-1) * b;
}
/*
int pow2(int b, int n)
{
// 用来保存计算结果
int result = 1;
//result *= b;
//result *= b;
//result *= b;
//result *= b;
//....
//n次
for (int i = 0; i<n; i++)
{
result *= b;
}
return result;
}*/
/*第一题:
提示用户输入一个正整数n,求出并输出其阶乘值n! = 1*2*3*4*...n
要求:用递归的方式编写一个函数实现n的阶乘
*/
#include <stdio.h>
int jieCheng(int n);
int main()
{
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while (n <= 0)
{
// 2.1 提示输入
printf("输入一个正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.计算阶乘
int result = jieCheng(n);
printf("%d! = %d\n", n, result);
return 0;
}
int jieCheng(int n)
{
// 如果n为1,那么阶乘值就是1
if (n == 1) return 1;
// jieCheng(n) = n! = 1*2*3*...*(n-1)*n
// jieCheng(n-1) = (n-1)! = 1*2*3*...*(n-1)
// jieCheng(n) = jieCheng(n-1) * n
return jieCheng(n-1) * n;
}
/*第二题
提示用户输入一个正整数n,求出并输出下列结果:1! + 2! + 3! + 4! + ... + n!
要求:用至少两种方式实现(函数名自拟,函数个数不限)
1> 非递归
2> 递归
*/
#include <stdio.h>
int pieAdd(int n);
int main()
{
// 1.定义变量存储用户输入的整数
int n = 0;
// 2.判断n是否为正整数
while (n <= 0)
{
// 2.1 提示输入
printf("输入一个正整数:\n");
// 2.2 让用户输入
scanf("%d", &n);
}
// 3.计算结果
int result = pieAdd(n);
printf("结果是%d\n", result);
return 0;
}
// ------------------非递归的方式----------------
int pieAdd(int n)
{
// 1.定义变量保存总和
int sum = 0;
// 2.需要累加n次,每次累加的都是一个阶乘值
for (int i = 1; i<=n; i++)
{
// 3.计算阶乘i!
// 3.1 定义变量保存阶乘的结果
int multi = 1;
for (int j = 1; j<=i; j++)
{
multi *= j;
}
// 4.累加每次的阶乘结果
sum += multi;
}
// 5.返回和
return sum;
}
/*
// ------------------递归的方式----------------
// 为了代码方便和性能,额外定义一个函数求阶乘
int jieCheng(int n)
{
// 如果n为1,那么阶乘值就是1
if (n == 1) return 1;
// jieCheng(n) = n! = 1*2*3*...*(n-1)*n
// jieCheng(n-1) = (n-1)! = 1*2*3*...*(n-1)
// jieCheng(n) = jieCheng(n-1) * n
return jieCheng(n-1) * n;
}
int pieAdd(int n)
{
// 1.如果n是1,计算结果就是1
if (n == 1) return 1;
// pieAdd(n) = 1! + 2! + ... + (n-1)!+ n!
// pieAdd(n-1) = 1! + 2! + ... + (n-1)!
// pidAdd(n) = pieAdd(n-1) + n!
return pieAdd(n - 1) + jieCheng(n);
}*/
/* 第三题:
提示输入5个学生的成绩(保证分数在0~100之间),算出平均分、最高分、最低分,然后输出
*/
#include <stdio.h>
// 学生的个数
#define kCount 5
int main()
{
// 1.定义一个数组保存5个学生的分数
// 初始化一下,默认都是-1分,只要默认值不是0~100都行
int scores[kCount] = {-1, -1, -1, -1, -1};
// 2.定义变量保存总分、最高分(默认是0分)、最低分(默认是100分)
int sum = 0, max = 0, min = 100;
// 3.提示输入
for (int i = 0; i<kCount; i++)
{
// 3.1 如果学生的成绩不在0~100内,就重新提示输入
while (scores[i]<0 || scores[i]>100)
{
// 3.1.1 提示输入
printf("请输入第%d个学生的成绩(0~100):\n", i + 1);
// 3.1.2 接收输入
scanf("%d", &scores[i]);
}
// 3.2 累加成绩
sum += scores[i];
// 3.3 判断最高分
if (scores[i] > max)
{
max = scores[i];
}
// 3.4 判断最低分
if (scores[i] < min)
{
min = scores[i];
}
}
// 4.输出结果
printf("平均分是%d,最高分是%d,最低分是%d\n", sum/kCount, max, min);
}
/*第四题
设计一个函数:将一维整型数组中的元素逆序存放。比如本来是1,3,4,2,逆序存放就变成了:2,4,3,1
*/
#include <stdio.h>
void reverse(int array[], int len);
int main()
{
int ages[4] = {1, 3, 4, 2};
reverse(ages, 4);
for (int i = 0; i<4; i++)
{
printf("%d\n", ages[i]);
}
return 0;
}
// 第一个参数是数组,第二个参数是数组长度
// 不需要返回值
// 因为改变了形参数组就相当于修改了外面的实参数组
void reverse(int array[], int len)
{
// 思路:以数组中间为轴,交换左右对称元素的值
// 比如array[0] array[1] array[2] array[3] array[4] array[5]
// 交换array[0]和array[5]的值
// 交换array[1]和array[4]的值
// 交换array[2]和array[3]的值
// 左边元素的下标(默认是最左边)
int left = 0;
// 右边元素的下标(默认是最右边)
int right = len - 1;
// 如果左边元素的下标 < 右边元素的下标
while (left < right)
{
// 利用中间变量交换两个元素的值
int temp = array[left];
array[left] = array[right];
array[right] = temp;
// 交换一次后,左边元素下标增加,右边元素下标减小
left++;
right--;
}
}
/*第五题:
输出99乘法表
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
*/
#include <stdio.h>
int main()
{
// 一共有多少行
for (int row = 1; row<=9; row++)
{
// 一共有多少列(其实列数==行数)
for(int column = 1; column<=row; column++)
{
// \t是tab键,目的是保持每列之间有相同的距离
printf("%dx%d=%d\t", row, column, row * column);
}
// 换行
printf("\n");
}
}