目前共有2篇帖子。 内容转换:不转换▼
 
点击 回复
399 1
【算法】用Java实现的一元多项式求和的算法
一派护法 十九级
1楼 发表于:2016-9-30 17:57
<%@ page pageEncoding="utf-8" %><%!
class Item implements Cloneable {
    double coef;
    int power;
    Item prev;
    Item next;
    
    public Item() {
    }
    
    public Item(double coef, int power) {
        this.coef = coef;
        this.power = power;
    }
    
    @Override
    public Item clone() {
        try {
            return (Item)super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
    
    @Override
    public String toString() {
        String coef_s = String.valueOf(coef);
        if (power == 0) {
            return coef_s;
        } else if (power == 1) {
            return coef_s + "<i>x</i>";
        } else {
            return coef_s + "<i>x</i>^" + power;
        }
    }
}
class Poly {
    private Item head;
    private Item rear;
    
    public void add(double coef, int power) {
        Item item = new Item(coef, power);
        add(item);
    }
    
    public void add(Item item) {
        if (item.coef == 0.0) {
            return;
        }
        if (rear != null) {
            rear.next = item; // 当前尾节点的下一个节点指向该节点
            item.prev = rear; // 该节点的前一个节点指向尾节点
        } else {
            head = item;
            item.prev = item.next = null;
        }
        rear = item;
    }
    
    public void add(Poly b) {
        Item p = head;
        Item q = b.head;
        while (p != null && q != null) {
            if (p.power == q.power) {
                p.coef += q.coef;
                if (p.coef == 0.0) {
                    delete(p);
                }
                p = p.next;
                q = q.next;
            } else if (p.power > q.power) {
                insertBefore(q.clone(), p);
                q = q.next;
            } else {
                p = p.next;
            }
        }
        while (q != null) {
            add(q.clone());
            q = q.next;
        }
    }
    
    public void delete(Item item) {
        if (item == head) {
            head = head.next;
        } else {
            item.prev.next = item.next;
            if (item == rear) {
                rear = item.prev;
            }
        }
    }
    
    public void insertBefore(Item item, Item pos) {
        if (pos == head) {
            item.prev = null;
            item.next = head;
            head.prev = item;
            head = item;
        } else {
            item.prev = pos.prev;
            item.next = pos;
            pos.prev.next = item;
            pos.prev = item;
        }
    }
    
    @Override
    public String toString() {
        if (head == null) {
            return "0";
        }
        
        String str = "";
        for (Item p = head; p != null; p = p.next) {
            if (p != head && p.coef >= 0.0) {
                str += '+';
            }
            str += p.toString();
        }
        return str;
    }
}
%><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>多项式求值</title>
</head>

<body>
<%
Poly a = new Poly();
a.add(15.7, 0);
a.add(40.8, 1);
a.add(0.35, 2);
a.add(-0.14, 4);
out.println("<i>a</i> = " + a.toString() + "<br>");

Poly b = new Poly();
b.add(-3.1, 0);
b.add(-40.8, 1);
b.add(0.45, 2);
b.add(1.33, 3);
b.add(0.14, 4);
b.add(9.675, 5);
b.add(1.382, 6);
out.println("<i>b</i> = " + b.toString() + "<br>");

a.add(b);
out.println("<i>a</i>+<i>b</i> = " + a.toString() + "<br>");

out.println("<hr>");
Poly c = new Poly();
c.add(4, -1);
c.add(3.1, 0);
c.add(39.8, 1);
c.add(-0.14, 4);
c.add(-0.675, 5);
out.println("<i>c</i> = " + c.toString() + "<br>");
b.add(c);
out.println("<i>b</i>+<i>c</i> = " + b.toString() + "<br>");
%></body>
</html>

一派护法 十九级
2楼 发表于:2016-9-30 17:58
【运行结果】
a = 15.7+40.8x+0.35x^2-0.14x^4
b = -3.1-40.8x+0.45x^2+1.33x^3+0.14x^4+9.675x^5+1.382x^6
a+b = 12.6+0.8x^2+1.33x^3+9.675x^5+1.382x^6
--------------------------------------------------------------------------------
c = 4.0x^-1+3.1+39.8x-0.14x^4-0.675x^5
b+c = 4.0x^-1-1.0x+0.45x^2+1.33x^3+9.0x^5+1.382x^6

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:399 回复数:1
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-9-30 17:58
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。