百钱买百鸡问题具体内容
百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用 100 文钱买 100 只鸡,公鸡、母鸡、小鸡各买多少只?
本程序要求解的问题是:给定一个正整数 n,用 n 文钱买 n 只鸡,问公鸡、母鸡、小鸡各买多少只?
输入格式
输入一个正整数 n。
输出格式
如果有解,输出有多少种解(可以用正整数表示的解)。
如果无解,输出"No Answer."。
问题解法与思路
首先,该问题最基本的解法就是采用三个FOR循环,显示这个解法时间复杂度已经达到了可怕的O(n的3次方)。该问题可以简化为如下两个基本方程:
消去小鸡个数x可得:
对于该式可以进行两个FOR遍历,但是效率仍然很低,时间复杂度为O(n的平方)。
其实,可以发现上式存在规律性。将z从0开始FOR循环,寻找第一个解。比方说n为100,z取0,可以得到此时(100-07)%4==0,这说明有解,也是第一个解,而剩下的解,由上式可知,总是比前一个解要大28,所以由(100-07)/28=3,可知还有3个解,最后可得解的数量为4。该算法复杂度为O(n)。
程序具体步骤
第一步,用for循环寻找第一个解,如果找到则跳出循环;
第二步,判断是否找到第一个解,如果是继续,如果不是返回"No Answer.",并return。
第三步,如果有第一个解,计算剩下解的数量。
C++程序
#include <iostream>
int main()
{
using namespace std;
long long int n;
cin>>n;
long int num=0;
long int i=0; //由于下面需要使用i,所以在For循环外部定义
for(;n>i*7;i++)
{
if((n-7*i)%4==0)
{
num++;
break;
}
}
if(num==0)
{
cout<<"No Answer.";
return 0;
}
num+=(n-7*i)/28;
cout<<num;
return 0;
}