首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

急求>>容易的多元一次方程题,求任何一组解的算法

2012-09-04 
急求简单的多元一次方程题,求任何一组解的算法请教大家给个简单的方法或思路,谢谢。目前有一家自助餐馆的

急求>>简单的多元一次方程题,求任何一组解的算法
请教大家给个简单的方法或思路,谢谢。

目前有一家自助餐馆的销售数据[每个账单的总钱数“含税”]:20.85 , 11.32 , 8.58 等等。
当前这家餐馆的收费一共有四种:成人(A)8.99/人,孩子(B)4.95/人,饮料(C)1.69/份,茶(D)0.5/份
当前餐馆的税率为:0.06.
问题就是:如何求得A,B,C,D的任意一组正数解?如:
20.85=(8.99*A+4.95*B+1.69*C+0.5*D)*1.06 =(8.99*2+4.95*0+1.69*1+0.5*0)*1.06 即一组解为:A=2,B=0,C=1,D=0

因为数据很多,所以需要写个程序处理一下,请各位指点迷津。谢谢。



[解决办法]
解方程
[解决办法]
可以这样,穷举出所有组合:

C/C++ code
struct int_struct{int i1,i2,i3,i4};map<float ,int_struct> mymap;for(int i1 = 0;i1<100;i1++)for(int i2 = 0;i2<100;i2++)for(int i3 = 0;i3<100;i3++)for(int i4 = 0;i4<100;i4++)float key = (8.99*i1+4.95*i2+1.69*i3+0.5*i4)*1.06;//将key,i1,i2,i3,i4对应关系保存起来,要用时直接查询即可int_struct res1(i1,i2,i3,i4);mymap[key] = res1;
[解决办法]
漏了大括号
C/C++ code
struct int_struct{int i1,i2,i3,i4};map<float ,int_struct> mymap;for(int i1 = 0;i1<100;i1++)for(int i2 = 0;i2<100;i2++)for(int i3 = 0;i3<100;i3++)for(int i4 = 0;i4<100;i4++){float key = (8.99*i1+4.95*i2+1.69*i3+0.5*i4)*1.06;//将key,i1,i2,i3,i4对应关系保存起来,要用时直接查询即可int_struct res1(i1,i2,i3,i4);mymap[key] = res1;}
[解决办法]
可以根据总和确定每个值大致的范围,份数又都是整数。确定了范围后用四重int循环,乘以系数后相加等于总和的值都是正数解
[解决办法]
完全背包勉强可以解决这个问题
貌似线性规划更好
[解决办法]
探讨
七楼的朋友,给点详细建议罢?谢谢。

[解决办法]
C/C++ code
#include <stdio.h>#include <stdlib.h>/**功能:回代求解(针对上三角形矩阵)*参数:matrix上三角阵,line矩阵行数*返回值:解*/float *substitUpMethod(float **matrix, int line){    float *result, tmp;    int i, j;    for(i=0; i<line; ++i)    {        if(matrix[i][i] == 0)        {            printf("方程无解或者解不惟一!\n");            return NULL;        }    }    result = (float*)malloc(sizeof(float)*line);    result[line-1] = 1;        for(i=line-1; i>=0; --i)    {        tmp = 0;        j = line - 1;        while(j > i)        {            tmp += matrix[i][j] * result[j];            --j;        }        result[i] = (matrix[i][line] - tmp) / matrix[i][i];    }    return result;}/**功能:用列主元消去法将矩阵变为上三角形矩阵*参数:matrix矩阵, matrixLine矩阵行数**/void eliminationMain(float **matrix, long matrixLine){    long i, j, k, sub, maxSub;    float tmp;    for(i=0; i<matrixLine-1; ++i)//列    {        maxSub = i;        for(sub=i; sub<matrixLine; ++sub)//找主元素        {            if(matrix[maxSub][i] < matrix[sub][i] || -matrix[sub][i] > matrix[maxSub][i])                maxSub = sub;        }        if(maxSub != i)        {            for(sub=0; sub<=matrixLine; ++sub)            {                tmp = matrix[maxSub][sub];                matrix[maxSub][sub] = matrix[i][sub];                matrix[i][sub] = tmp;            }        }        //第j行的数据 - (第i行的数据 / matrix[i][i])*matrix[j][i]        for(j=i+1; j<matrixLine; ++j)        {            for(k=i+1; k<=matrixLine; ++k)            {                matrix[j][k] -= (matrix[i][k]/matrix[i][i])*matrix[j][i];            }            matrix[j][i] = 0;                    }    }    //输出上三角形矩阵    printf("\n  上三角形矩阵为:\n");    for(i=0; i<matrixLine; ++i)    {        for(j=0; j<matrixLine+1; ++j)        {            printf("%13f", matrix[i][j]);        }        printf("\n");    }    }/**功能:输出数组matrix*参数:数组matrix, line矩阵的行数**/void display(float **matrix, long line, long row){    int i, j;    for(i=0; i<line; ++i)    {        for(j=0; j<row; ++j)        {            printf("%13f  ", matrix[i][j]);        }        printf("\n");    }    printf("\n");}/**功能:接收数组matrix*参数:数组matrix, matrixLine矩阵的行数**/void inputMatrix(float **matrix, long matrixLine, long matrixRow){    int i, j;    printf("请输入矩阵元素:\n");    for(i=0; i<matrixLine; ++i)    {        for(j=0; j<matrixRow; ++j)        {            scanf("%f", &matrix[i][j]);        }    }}/**功能:输出结果*参数:结果数组,数组长度*/void printResult(float *result, long matrixLine){    int i;    if(result == NULL)        return;    printf("    方程组的解为:\n\t");    for(i = 0; i < matrixLine; ++i)        printf("%13f", result[i]);    printf("\n");}/**功能:获取文件中矩阵的个数*返回值:文件中矩阵的个数**/int getMatrixCnt(){    FILE *fp;    char ch;    int matrixCnt = 0;    fp = fopen("matrix.txt", "r");    if(fp == NULL)    {        printf("cannot open file!\n");        return -1;    }    while(!feof(fp))    {        ch = fgetc(fp);        if(ch == '#')            ++matrixCnt;    }    --matrixCnt;//文件以#开始以#结束    fclose(fp);    return matrixCnt;}/**功能:获取文件中第matrixIndex个矩阵的信息*参数:矩阵索引*返回值:矩阵的信息*matrixInfo[0]第matrixIndex个矩阵在文件中的位置*matrixInfo[1]第matrixIndex个矩阵的行数*matrixInfo[2]第matrixIndex个矩阵的列数*/long *getMatrixInfo(int matrixIndex){    FILE *fp;    char ch;    long *matrixInfo, line = 0, row = 0;    matrixInfo = (long*)malloc(sizeof(long)*3);    fp = fopen("matrix.txt", "r");        while(!feof(fp))    {        ch = fgetc(fp);        if(ch == '#')        {            --matrixIndex;            if(matrixIndex == 0)            {                matrixInfo[0] = ftell(fp);                ch = fgetc(fp);                while(ch != '#')                {                    ch = fgetc(fp);                    if(ch == 10)                        ++line;                    else if(ch == ' ')                        ++row;                }                break;            }        }    }    matrixInfo[1] = line;    matrixInfo[2] = (row + line) / line;    fclose(fp);    return matrixInfo;}/**功能:将文件中position位置处的矩阵存储地数组matrix中*参数:matrix数组, position矩阵位置, line矩阵行数**/void getMatrix(float **matrix, long position, long line, long row){    FILE *fp;    fp = fopen("matrix.txt", "r");    int i = 0, j = 0;    float tmp;    if(fp == NULL)    {        printf("cannot open file!\n");        return;    }    fseek(fp, position, SEEK_SET);    while(i < line)    {        fscanf(fp, "%f", &tmp);        matrix[i][j++] = tmp;        if(j == row)        {            ++i;            j = 0;        }    }    fclose(fp);}/**功能:给矩阵申请空间*参数:matrixLine矩阵的行数和列数*返回值:矩阵的首地址*/float** initMatrix(long matrixLine, long matrixRow){    float** matrix;    int i;    matrix = (float**)malloc(sizeof(float*)*matrixLine);    for (i=0; i<matrixLine; ++i)        *(matrix+i) = (float*)malloc(sizeof(float)*matrixRow);    return matrix;}/**功能:释放空间*参数:矩阵,矩阵的行数*返回值:NULL*/float **freeMatrix(float** matrix, long matrixLine){    int i;    for(i = 0; i < matrixLine; ++i)        free(matrix[i]);    free(matrix);    return NULL;}int main(){    int matrixCnt, matrixIndex;    long *matrixInfo = NULL, position, matrixLine, matrixRow;    float **matrix = NULL, *result = NULL;    float **matrixL = NULL, **matrixU = NULL;    //从文件读取矩阵    matrixCnt = getMatrixCnt();    printf("文件中有%d个矩阵,读取第matrixIndex个矩阵: matrixIndex = ", matrixCnt);    scanf("%d", &matrixIndex);    while(matrixIndex > matrixCnt)    {        printf("输入有误,请重新输入: matrixIndex = ");        scanf("%d", &matrixIndex);        fflush(stdin);    }    matrixInfo = getMatrixInfo(matrixIndex);    position = matrixInfo[0];    matrixLine = matrixInfo[1];    matrixRow = matrixInfo[2];    free(matrixInfo);    matrixInfo = NULL;    matrix = initMatrix(matrixLine, matrixRow);    getMatrix(matrix, position, matrixLine, matrixRow);    display(matrix, matrixLine, matrixRow);    //高斯列主元素消去法解方程    eliminationMain(matrix, matrixLine);    result = substitUpMethod(matrix, matrixLine);    printResult(result, matrixLine);    matrix = freeMatrix(matrix, matrixLine);    free(result);    result = NULL;    return 0;}从文件读数据文件名matrix.txt内容如下#1 2 1 -2 -12 5 3 -2 3-2 -2 3 5 151 3 2 5 9#1 1 0 4 1-1 1 1 3 -21 3 5 -4 -40 1 2 -1 -2#文件内容所代表的意思如这一组数据1 2 1 -2 -12 5 3 -2 3-2 -2 3 5 151 3 2 5 9表示1*x1 + 2*x2 + 1*x3 + (-2)*x4 = -12*x1 + 5*x2 + 3*x3 + (-2)*x4 = 3.......运行结果文件中有2个矩阵,读取第matrixIndex个矩阵: matrixIndex = 1     1.000000       2.000000       1.000000      -2.000000      -1.000000     2.000000       5.000000       3.000000      -2.000000       3.000000    -2.000000      -2.000000       3.000000       5.000000      15.000000     1.000000       3.000000       2.000000       5.000000       9.000000  上三角形矩阵为:     2.000000     5.000000     3.000000    -2.000000     3.000000     0.000000     3.000000     6.000000     3.000000    18.000000     0.000000     0.000000     0.500000    -0.500000     0.500000     0.000000     0.000000     0.000000     5.000000     5.000000    方程组的解为:            -3.000000     1.000000     2.000000     1.000000Press any key to continue 

热点排行