百钱买百鸡问题与百钱兑换问题(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;
对于这段代码来说,关于总表达式5i+2j+k=100n来说;以i为变量,确定了i和j的值,那k值其实就可以固定了;
所以sum+=5i/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关注一波,刷个赞!!!