Feed Ratios

题意:有三种饲料,饲料中均含有大麦、燕麦和小麦这三种成分,并且知道每种饲料中三种成分的比例。求按何比例混合三种饲料可以使大麦、燕麦和小麦的比例为x:y:z


解题思路

  1. 根据输入列出4元线性方程组
  2. 应用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;
}





































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值