百钱买百鸡问题与百钱兑换问题(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关注一波,刷个赞!!!