方案一
/*设1角、5角、1元的硬币数量分别为 x 、 y 、 z 枚。
根据题目条件可得方程组:
x + y + z = 50 (硬币总数为50枚)
0.1x + 0.5y + z = 20 (总金额为20元)
可以通过三层循环枚举 x (范围是0到50)、 y (范围是0到50)、 z (范围是0到50),在循环中判断是否满足上述两个方程。若满足,则得到一组解。*/
#include<stdio.h>
int main()
{
//设 一元有i枚,五毛有j枚,一毛有k枚;计数1,计数2.
int i=0,j=0,k=0,count1=0,count2=0;
for(i=0;i<=20;i++)
{
for(j=0;j<=40;j++)
{
for(k=0;k<=200;k++)
{
count2++;//内循环执行次数
int sum=i*10+5*j+1*k;//计算总金额
if(sum==200&&(i+j+k)==50)//判断总数是否为50枚,计算总金额为20元
{
printf ("一元%d,五毛%d,一毛%d ",i,j,k);//打印满足条件各个的枚数
count1++;//满足条件的多少
}
}
}
}
printf("满足条件的执行总数%d 内层循环执行次数%d ",count1,count2);
return 0;
}
/*时间复杂度:由于使用了三重嵌套循环,时间复杂度为
O(21×41×201)=O(173061)
空间复杂度:空间复杂度为 O(1)*/
方案二
算法思路
设1角硬币数量为 x ,5角硬币数量为 y ,1元硬币数量为 z 。通过三重循环遍历所有可能的硬币组合情况:
1. 最外层循环控制1角硬币的数量 x ,范围从0到50。
2. 中层循环控制5角硬币的数量 y ,范围从0到50 - x ,因为硬币总数为50枚,确定 x 后, y 最多为剩余数量。
3. 内层通过 z = 50 - x - y 得到1元硬币数量。
4. 每次循环中,判断 0.1 * x + 0.5 * y + 1 * z == 20 是否成立,如果成立,则找到了一种符合条件的硬币组合。其中判断条件语句是执行次数最多的基本语句。
C语言代码
c
#include <stdio.h>
int main() {
int x, y, z;
int count = 0; // 用于记录执行次数最多的语句(判断语句)的执行次数
// 遍历1角硬币数量,最多50枚
for (x = 0; x <= 50; x++) {
// 遍历5角硬币数量,根据1角硬币数量确定范围
for (y = 0; y <= 50 - x; y++) {
z = 50 - x - y; // 计算1元硬币数量
count++; // 每次循环判断条件执行次数加1
if (0.1 * x + 0.5 * y + z == 20) {
printf("1角硬币%d枚,5角硬币%d枚,1元硬币%d枚 ", x, y, z);
}
}
}
printf("执行次数最多的语句执行次数: %d ", count);
return 0;
}
执行次数分析
最内层的判断语句 if (0.1 * x + 0.5 * y + z == 20) 是执行次数最多的基本语句。
外层循环 x 从0到50,共51次;对于每一个 x ,中层循环 y 从0到50 - x ,当 x = 0 时,中层循环51次,当 x = 50 时,中层循环1次。
根据等差数列求和公式 (首项 + 末项) * 项数 / 2 ,总执行次数为 (1 + 51) * 51 / 2 = 1326 次。
方案三
算法思路
设1角、5角、1元的硬币数量分别为 x 、 y 、 z 枚。
- 根据题目条件可得到两个方程:
- 0.1 * x + 0.5 * y + z = 20 (总金额为20元,单位统一为元)
- x + y + z = 50 (硬币总数为50枚)
- 由第二个方程可得 z = 50 - x - y ,将其代入第一个方程:
egin{align*}
0.1 * x + 0.5 * y + 50 - x - y &= 20\
0.1 * x + 0.5 * y - x - y &= 20 - 50\
- 0.9 * x - 0.5 * y &= - 30\
9 * x + 5 * y &= 300\
y&= rac{300 - 9 * x}{5}
end{align*}
- 因为 x 、 y 、 z 都应为非负整数,所以通过枚举 x 的值来确定 y 和 z 的值。
代码实现(C语言)
c
#include <stdio.h>
int main() {
int x, y, z;
// 遍历1角硬币的数量,最多50枚
for (x = 0; x <= 50; x++) {
// 根据公式计算5角硬币的数量
y = (300 - 9 * x) / 5;
// 计算1元硬币的数量
z = 50 - x - y;
// 判断是否满足总金额为20元以及所有硬币数量都为非负整数的条件
if (0.1 * x + 0.5 * y + z == 20 && x >= 0 && y >= 0 && z >= 0) {
printf("1角硬币: %d枚, 5角硬币: %d枚, 1元硬币: %d枚 ", x, y, z);
}
}
return 0;
}
在这段代码中, for 循环内部的语句是基本语句。
for循环中 x 的取值范围是从 0 到 50 ,所以 for 循环执行次数为 51 次,即执行次数最多的基本语句执行次数为51次。