百鸡百钱系列问题
问题描述:
经典问题的描述如下:在市场上,鸡的售价分别是:公鸡3文钱1只,母鸡2文1只,小鸡1文3只。问拿100文钱想买100只鸡,则公鸡、母鸡和小鸡应各买多少只? 现在要解决的问题是:如果鸡的价格保持不变,有人拿钱若干,想使买到的鸡数与钱数相当,问有哪些解决方案。
输入:
输入数据包含一个整数N(10<=N<=10000),表示钱数。
输出:
输出数据需列出满足买到的鸡数与所持钱数相当的所有解,每个解占一行,包含三个整数分别表示要买的公鸡、母鸡和小鸡的数量,用空格分隔。存在多组解的情况下,输出按升序排列(即0 0 1在0 1 0之前)。
输入样例:
10
输出样例:
0 4 6
一般的代码:
#include <iostream> using namespace std; void Num1(int n) { for(int i=0;(3*i)<=n;i++) { for(int j=0;(2*j)<=(n-3*i);j++) { for(int k=0;k<=3*(n-3*i-2*j);k++) if(n==(i+j+k)&&n==(k/3+2*j+3*i)) cout<<i<<" "<<j<<" "<<k<<endl; } } } int main() { int n; cin>>n; Num1(n); }
比较高效的代码(1):
#include <iostream> using namespace std; void Num1(int n) { int k; for(int i=0;i<n/3;i++) { for(int j=0;j<n/2;j++) { k=n-i-j; if((k/3+i*3+j*2)==n&&(k%3==0)) cout<<i<<" "<<j<<" "<<k<<endl; } } } int main() { int n; cin>>n; Num1(n); }
比较高效的代码(2):
#include <iostream> #include <stdio.h> using namespace std; int main() { int cock,hen,chick; int money; scanf("%d",&money); for(chick=0;chick<=money;chick+=3) { cock=chick*5/3-money; hen=2*money-chick*8/3; if(cock+hen+chick==money&&cock>=0&&hen>=0) printf("%d %d %d\n",cock,hen,chick); } }
态度决定高度,细节决定成败,