高斯消元整数消元模板

高斯消元就是来接方程组的。(可以跟矩阵联系在一起)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN = 1e2+5;
int equ, var;///equ个方程 var个变量
int a[MAXN][MAXN];///增广矩阵
int x[MAXN];///解的数目
bool free_x[MAXN];///判断是不是自由变元
int free_num;///自由变元的个数
inline int GCD(int m, int n)
{
    if(n == 0)
        return m;
    return GCD(n, m%n);
}
inline int LCM(int a, int b)
{
    return a/GCD(a,b)*b;
}

int Gauss()
{
    int Max_r;///当前列绝对值最大的存在的行
    ///col:处理当前的列
    int row = 0;
    int free_x_num;
    int free_index;
    for(int col=0; row<equ&&col<var; row++,col++)
    {
        Max_r = row;
        for(int i=row+1; i<equ; i++)
            if(abs(a[i][col]) > abs(a[Max_r][col]))
                Max_r = i;

        if(Max_r != row)
            for(int i=0; i<var+1; i++)
                swap(a[row][i], a[Max_r][i]);

        if(a[row][col] == 0)
        {
            row--;
            continue;
        }
        for(int i=row+1; i<equ; i++)
        {
            if(a[i][col])
            {
                int lcm = LCM(abs(a[i][col]), abs(a[row][col]));
                int tp1=lcm/abs(a[i][col]), tp2=lcm/abs(a[row][col]);
                if(a[row][col]*a[i][col] < 0)
                    tp2 = -tp2;
                for(int j=col; j<var+1; j++)
                    a[i][j] = tp1*a[i][j]-tp2*a[row][j];
            }
        }
    }
    for(int i=row; i<equ; i++)
        if(a[i][var])
            return -1;///无解

    if(row < var)
    {
        for(int i=row-1; i>=0; i--)
        {
            free_x_num = 0;
            for(int j=0; j<var; j++)
                if(a[i][j] && free_x[j])
                {
                    free_x_num++;
                    free_index = j;
                }

            if(free_x_num > 1)
                continue;
            int tmp = a[i][var];
            for(int j=0; j<var; j++)
                if(a[i][j] && j!=free_index)
                    tmp -= a[i][j]*x[j];
            x[free_index] = tmp/a[i][free_index];/// 求出该变元.
            free_x[free_index] = 0; /// 该变元是确定的.
        }
        return var - row;///自由变元的个数
    }
    for(int i=var-1; i>=0; i--)
    {
        int tmp = a[i][var];
        for(int j=i+1; j<var; j++)
            if (a[i][j])
                tmp -= a[i][j]*x[j];
        if (tmp%a[i][i])
            return -2; /// 说明有浮点数解,但无整数解.
        x[i] = tmp/a[i][i];
    }
    return 0;///唯一解
}
int main()
{
    while(cin>>equ>>var)
    {
        for(int i=0; i<equ; i++)
        {
            for(int j=0; j<var+1; j++)
                cin>>a[i][j];
        }
        cout<<Gauss()<<endl;
    }
    return 0;
}
时间: 2024-11-03 22:01:26

高斯消元整数消元模板的相关文章

【信号、图像、Matlab】如何得到高斯滤波器的整数模板

[信号.图像.Matlab]如何得到高斯滤波器的整数模板 如何得到高斯滤波器的整数模板?这个问题困扰了我两天,上网搜索的代码,基本上都生成的小数,有的文档给写了3*3,5*5,7*7的整数形式,但是没有说是怎么得到的,应该说是我没有仔细看吧,现在恍然大悟,只要将左上角的元素化为1就可以了啊.我还以为用什么高级方法得出来的,晕死了. 二维高斯分布公式: 要得到高斯滤波器的整数模板就要从这个公式入手,这个公式在三维坐标下的形式是这样的: 我们要的高斯滤波器的整数模板相当于这个三维图形在底面(将底面网

牙膏5元,牙刷2元,肥皂3元,100元买这三种恰好花光,请问有多少种可能性

Console.WriteLine("牙膏5元,牙刷2元,肥皂3元,100元买这三种恰好花光"); int a1 = 0, b1 = 0, c1 = 0, sum = 0; for (int a = 0; a <= 20; a++) { a1 = 5 * a; for (int b = 0; b <= 50; b++) { b1 = 2 * b; for (int c = 0; c < 33; c++) { c1 = 3 * c; if (a1 + b1 + c1 =

java-第六章-for-马克思数学问题一共30人男花3元女2元小孩1元动50元男女小孩多少人?

public class A03 { public static void main(String[] args) { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { for (int j = 0; j <30; j++) { if(30-i-j>0){ int sum=i*3+j*2+1*(30-i-j); if(sum==50){ System.out.println("男"+i+

元叶盛、元叶公爵之美式风格设计

元叶盛.元叶公爵之美式风格设计 原文地址:http://blog.51cto.com/14103885/2324755

自定义元类和元类的用途

# -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/12/3 23:13' def create_class(name): if name == "user": class User: def __str__(self): return "user" return User # 这一步很关键一定要把类给return回去 elif name == "company": class

poj 3185 The Water Bowls 高斯消元枚举变元

题目链接 给一行0 1 的数, 翻转一个就会使他以及它左右两边的都变, 求最少多少次可以变成全0. 模板题. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include

python之元编程(元类实例)

本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保存到对应的父类元组的childrens的集合中. 同时对__str__打印方法和__iter__迭代方法进行了定义,其中: __iter__方法返回类名的childrens集合,并对其中的元素进行输入. 而Sharp继承自RegisterClasses, 当 for s in Sharp: prin

中秋送好礼:天嵌阿里巴巴全场买满1500元返50元

2014天嵌中秋送好礼,广州天嵌也在阿里巴巴店铺做中秋优惠活动,回馈广大支持广州天嵌的客户. 2014年9月4日,在广州天嵌阿里巴巴店铺消费满1500元即可返还50元给客户(适合阿里旺铺的所有产品). 同时,E8.E9卡片式电脑两款产品在活动当天可享受9.5折的优惠(此优惠只适用E8 E9两款产品). 两个优惠活动可叠加进行,这么优惠的活动,亲们还等什么呢?快来广州天嵌阿里巴巴店铺,下面是广州天嵌阿里巴巴店铺的链接: http://embedsky.1688.com/

天天快报邀请码:PFDP9R,得红包最少1元最高20元

天天快报邀请码:PFDP9R 天天快报邀请码:PFDP9R 天天快报邀请码:PFDP9R 使用方法: 首先打开天天快报, 然后点击“我的” 点击“福利红包” 往下滚动屏幕,新手任务的第一项“填写邀请码”点击“去完成” 完成后可得最少一元,最多20元据说的红包,并且还可以邀请别人也获取红包哦. 来张图吧: 原文地址:https://www.cnblogs.com/flying607/p/10977518.html