//百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,
//用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
+(void)arithmetic
{
// 设公鸡 x, 母鸡y,小鸡z, 5x+3y+z/3=100;x<20,y<33,z=100-x-y.
int totalMoney = 10001;
int totalChicken = 10001;
int iMax = totalMoney/5;
int jMax = totalMoney/3;
int z = 0;
for (int i = 1; i < iMax; i++)
{
for (int j = 1; j < jMax; j++)
{
int k = 3*(totalMoney-5*i-3*j);
if (k<0)
{
continue;
}
if (totalChicken == i+j+k)
{
z++;
NSLog(@"i = %d,j = %d, k = %d", i,j,k);
}
}
}
if (0==z)
{
NSLog(@"无解");
}
else
{
NSLog(@"共有%d组解",z);
}
/*
总结,时间复杂度o(n^2);
i = 4,j = 18, k = 78
i = 8,j = 11, k = 81
i = 12,j = 4, k = 84
i以4递增,j以7递减,k以3递增 ,n为鸡数,m为钱数
5x+3y+(n-x-y)/3 = m
15x +9y + n-x-y = 3m
14x+8y=3m-n
7x+4y = (3m-n)/2;
y = [(3m-n)/2 -7x]/4
*/
int total = 3*totalMoney - totalChicken;
if ((total&1))
{
NSLog(@"数据不对");
return;
}
for (int i = 1; i < total/14; i++)
{
if (0 == (total/2 - 7*i)%4)
{
int j = (total/2 - 7*i)/4;
if (j>0)
{
int k = totalChicken - i- j;
if (k>0)
{
NSLog(@"i = %d,j = %d, k = %d", i,j,k);
}
}
}
}
//算法复杂度o(n)
/*
代数解法ax+by = c有整数解充分必要条件是(a,b)|c
假设不定方程特解为x0,y0,又(7,4)=1;方程解的形式
x=x0-bt,y=y0+at,t=0,-1,-2,-3...(x0是从最小开始,t取负数);
从这里看出解呈现等差现象,这个可以直接获得解,去除了3/4无效循环。
*/
}