切换到宽版
  • 16690阅读
  • 11回复

解线性方程组程序源代码 [复制链接]

上一主题 下一主题
离线r134a
 
只看楼主 倒序阅读 0 发表于: 2006-07-26
— 本帖被 stevenjl 从 竞赛题库 移动到本区(2007-08-12) —
  摘录一个好贴:

帖一个实用的小程序!!!(解线性方程组) 

作者: 网友PwlEast
  1. {输入方程个数n,再输入n个方程}
  2. {例如方程3x+2y=1,2x+7y=0,则输入:
  3. 2
  4. 3 2 1
  5. 2 7 0
  6. }
  7. {使用了高斯消元法}
  8. program p1052;{解线性方程组}
  9. const maxn=100;
  10. type float=real;
  11.     int=integer;
  12. var a:array[1..maxn,1..maxn]of float;
  13.     b:array[1..maxn]of float;
  14.     d,t,sum:float;
  15.     k,l,i,j,m,n,ii,jj,loop:int;
  16.     ch:char;
  17. begin
  18.     readln(n);
  19.     m:=n;
  20.     for ii:=1 to n do begin
  21.         for jj:=1 to m do read(a[ii][jj]);
  22.         read(b[ii]);
  23.     end;
  24.     k:=1;
  25.     d:=0;
  26.     l:=0;
  27.     while(k<=n)do begin
  28.                   d:=a[k][k];
  29.                   l:=k;
  30.                   for i:=k+1 to n do begin
  31.                       if(abs(a[k])>abs(d)) then begin
  32.                                               d:=a[k];
  33.                                               l:=i;
  34.                       end;
  35.                   end;
  36.                   if(l<>k)then begin
  37.                               for j:=k to n do begin
  38.                                   t:=a[l,j];
  39.                                   a[l,j]:=a[k,j];
  40.                                   a[k,j]:=t;
  41.                               end;
  42.                               t:=b[k];
  43.                               b[k]:=b[l];
  44.                               b[l]:=t;
  45.                   end;
  46.                   for j:=k+1 to n do a[k,j]:=a[k][j]/a[k][k];
  47.                   b[k]:=b[k]/a[k,k];
  48.                   for i:=k+1 to n do begin
  49.                       for j:=k+1 to n do a[i,j]:=a[i,j]-a[i,k]*a[k,j];
  50.                       j:=1;
  51.                       b:=b-a[i,k]*b[k];
  52.                   end;
  53.                   inc(k);
  54.     end;
  55.     for i:=n-1 downto 1 do begin
  56.         sum:=0;
  57.         for j:=i+1 to n do sum:=sum+a[i,j]*b[j];
  58.         b:=b-sum;
  59.     end;
  60.     for loop:=1 to n do begin
  61.         if loop=n then ch:=chr(13) else ch:=' ';
  62.         write(round(b[loop]),ch);
  63.     end;
  64.     readln;
  65.     readln;
  66. end.         
  67.  

作者: PwlEast
Archimedes: 您的代码已被加上
.


祝大家明年NOIP大获全盛!


.
离线勇气les
只看该作者 1 发表于: 2006-07-26
谢谢——————————
离线crystal
只看该作者 2 发表于: 2006-08-07
Be careful--To 北极星的眼泪
文中不应出现“[ ]”中夹字母“i”,因为系统中将它默认为是 斜体 的标志!!
离线crystal
只看该作者 3 发表于: 2006-08-07
修改后的程序
作者: 网友PwlEast

{输入方程个数n,再输入n个方程}
{例如方程3x+2y=1,2x+7y=0,则输入:
2
3 2 1
2 7 0
}
{使用了高斯消元法}
program p1052;{解线性方程组}
const maxn=100;
type float=real;
int=integer;
var a:array[1..maxn,1..maxn]of float;
b:array[1..maxn]of float;
d,t,sum:float;
k,l,iii,j,m,n,ii,jj,loop:int;
ch:char;
begin
readln(n);
m:=n;
for ii:=1 to n do begin
    for jj:=1 to m do read(a[ii][jj]);
    read(b[ii]);
end;
k:=1;
d:=0;
l:=0;
while(k<=n)do begin
        d:=a[k][k];
        l:=k;
        for iii:=k+1 to n do begin
        if(abs(a[iii][k])>abs(d)) then begin
                    d:=a[iii][k];
                    l:=iii;
        end;
        end;
        if(l<>k)then begin
            for j:=k to n do begin
              t:=a[l,j];
              a[l,j]:=a[k,j];
              a[k,j]:=t;
            end;
            t:=b[k];
            b[k]:=b[l];
            b[l]:=t;
        end;
        for j:=k+1 to n do a[k,j]:=a[k][j]/a[k][k];
        b[k]:=b[k]/a[k,k];
        for iii:=k+1 to n do begin
        for j:=k+1 to n do a[iii,j]:=a[iii,j]-a[iii,k]*a[k,j];
        j:=1;
        b[iii]:=b[iii]-a[iii,k]*b[k];
        end;
        inc(k);
end;
for iii:=n-1 downto 1 do begin
    sum:=0;
    for j:=iii+1 to n do sum:=sum+a[iii,j]*b[j];
    b[iii]:=b[iii]-sum;
end;
for loop:=1 to n do begin
    if loop=n then ch:=chr(13) else ch:=' ';
    write(round(b[loop]),ch);
end;
readln;
readln;
end.
文中将所有“i”换成“iii”。
(修改:Crystal)
[ 此贴被crystal在2006-08-07 21:22重新编辑 ]
离线r134a
只看该作者 4 发表于: 2006-08-07
谢谢!!!
.


祝大家明年NOIP大获全盛!


.
离线stevenjl

只看该作者 5 发表于: 2006-08-08
为什么不用[code][/code]框起来
Dream Walker...
离线r134a
只看该作者 6 发表于: 2006-08-08
引用第5楼stevenjl2006-08-08 09:03发表的“”:
为什么不用
框起来



这个功能太高级,偶不知道怎么用~~~
.


祝大家明年NOIP大获全盛!


.
离线jysc
只看该作者 7 发表于: 2006-08-10
吃代码了
离线r134a
只看该作者 8 发表于: 2006-08-10
楼上的~~~~再灌水~~~论坛就不止是吃代码了~~~~~就会吃你了!~~~
.


祝大家明年NOIP大获全盛!


.
离线wing
只看该作者 9 发表于: 2006-09-20
呵呵
快速回复
限100 字节
 
上一个 下一个