C语言:把20元硬币换成一角,五角,一元,硬币总数五十枚,求执行次数

方案一

/*设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次。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值