题意:有三种饲料,饲料中均含有大麦、燕麦和小麦这三种成分,并且知道每种饲料中三种成分的比例。求按何比例混合三种饲料可以使大麦、燕麦和小麦的比例为x:y:z
解题思路:
- 根据输入列出4元线性方程组
- 应用Cramer法则可以很方便解决这道题,不再赘述
代码:
/*
ID: zc.rene1
LANG: C
PROG: ratios
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Transform(int mixtures[3][3])
{
int i, j, temp;
for (i=0; i<3; i++)
{
for (j=0; j<i; j++)
{
temp = mixtures[i][j];
mixtures[i][j] = mixtures[j][i];
mixtures[j][i] = temp;
}
}
}
int GetValue(int mixtures[3][3])
{
int p[3];
p[0] = mixtures[0][0] * (mixtures[1][1] * mixtures[2][2] - mixtures[1][2] * mixtures[2][1]);
p[1] = mixtures[0][1] * (mixtures[1][0] * mixtures[2][2] - mixtures[1][2] * mixtures[2][0]);
p[2] = mixtures[0][2] * (mixtures[1][0] * mixtures[2][1] - mixtures[1][1] * mixtures[2][0]);
return p[0] - p[1] + p[2];
}
void GetResult(int d[4], FILE *fout)
{
int n, i, temp;
int result[3];
if (d[0] < 0)
{
for (i=0; i<4; i++)
{
d[i] -= 2*d[i];
}
}
for (i=0; i<4; i++)
{
if (d[i] < 0)
{
fprintf(fout, "NONE\n");
return ;
}
}
for (n=1; n<100; n++)
{
temp = 1;
for (i=1; i<4; i++)
{
if (((n * d[i]) % d[0]) != 0)
{
temp = 0;
break;
}
}
if (temp == 1)
{
break;
}
}
for (i=0; i<3; i++)
{
result[i] = d[i+1] * n / d[0];
}
fprintf(fout, "%d %d %d %d\n", result[0], result[1], result[2], n);
}
int main(void)
{
FILE *fin, *fout;
int goal[3];
int mixtures[3][3];
int mixtures_cp[3][3];
int i, j;
int d[4];
fin = fopen("ratios.in", "r");
fout = fopen("ratios.out", "w");
for (i=0; i<3; i++)
{
fscanf(fin, "%d", &goal[i]);
}
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
fscanf(fin, "%d", &mixtures[i][j]);
}
}
Transform(mixtures);
memcpy(mixtures_cp, mixtures, 9*sizeof(int));
d[0] = GetValue(mixtures);
if (d[0] != 0)
{
for (i=1; i<=3; i++)
{
for (j=0; j<3; j++)
{
mixtures[j][i-1] = goal[j];
}
d[i] = GetValue(mixtures);
memcpy(mixtures, mixtures_cp, 9*sizeof(int));
}
GetResult(d, fout);
}
else
{
fprintf(fout, "NONE\n");
}
return 0;
}