百钱买百鸡问题与百钱兑换问题(C与C++)经典编程算法

百钱兑换问题提供了两种思路,最精彩的在最下面的代码,供大佬参考,优美的代码赏心悦目(附有详细思路,记得点赞!!!)

1.首先,让我们讲讲百钱买百鸡问题

张丘建在《算经》一书中提出的数学问题:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
1只公鸡5个铜钱,1只母鸡3个铜钱,3只小鸡1个铜钱。现在有100个铜钱,要买100只鸡,每种鸡至少要买一只,问有几种买法?

#include<stdio.h>
int main()
{
  int i,j,k;//i为公鸡个数  j母鸡个数  k为小鸡个数
  for (i=1;i<=20;i++)//公鸡
    for(j=1;j<=33;j++)//母鸡
        for(k=1;k<=100;k++)//小鸡
          if(100==i*5+j*3+k/3.0 && k%3==0 && i+j+k==100)
            printf("%d,%d,%d\n",i,j,k);
  return 0;
}

思路讲解:这里是假设思想的应用,倘若我买的全为公鸡,则我最多只能买到20只公鸡即100/5=20,所以i<=20;同理若买的全为母鸡则100/3=33余1,s所以j<=33;此处小心小鸡数目不是300,而应该是100,因为题目要求了要买100只鸡,所以k<=100;if条件即三元一次方程组,求i,k,j的值。

2.百钱兑换问题

输入整型人民币数额 n(元),将其兑换成1/2/5分的硬币,有多少种换法?

#include<iostream>
using namespace std;
int main()
{
    int n,sum=0;
    cin>>n;
    for( int i=0;i<=(n*100/5);i++)
        for( int j=0;j<=(n*100/2);j++)
            if((n*100-5*i-2*j)>=0)
            {
                sum++;
            }
    cout<<sum;
    return 0;
}

思路说明:其实质与上面的百钱买鸡实质思想一样,1元最多换20个5分,则n元最多换n*100/5个5分…同时运用了嵌套for循环的方式,算是思路简单的方法。

法二,代码进阶版(需要一定的数学思维)

#include <iostream>
using namespace std;
int main()
{
	int n, j, sum= 0;
	cin >> n;
	j = n * 20;//输入n元最多能得到j个5分(n*100/5);
	for ( int i = 1; i <= j; i++)//i是5分的个数
		{
		sum+= 5 * i / 2;
		}
	sum+= (j + 1);
	cout << sum;//sum种换法
	return 0;
}

输入:1 输出: 541

输入:2 输出: 2081

‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬对于这段代码的,简练但是需要一定的数学思考,首先,设i个5分,j个2分,k个1分,n的值为1,则n=1时,最多可以分得20个5分,50个2分,100个1分;所以5分最多个数20与50个2分的比例为5:2,所以j=5i/2;
对于这段代码来说,关于总表达式5
i+2j+k=100n来说;以i为变量,确定了i和j的值,那k值其实就可以固定了;
所以sum+=5
i/2就是j的种数;n=1时,i遍历了20遍,j出现了共520个。所以此时sum=520
但要考虑到没有j的情况,所以出现sum+=(q+1)这行代码;当n=1时,i与k同时一起出现的组合有19种可能,只有i时出现20个5分这1种可能,只有k时有100个一分这1种可能,所以在n=1时前面的s要加上19+1+1,即q+1。
所以有sum+=(q+1);

看在我辛苦思考和码字的情况下,希望各位xdm关注一波,刷个赞!!!

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Script kid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值