找回密码
 立即注册
查看: 1170|回复: 16

编程区题目之三 多项式加法

 关闭 [复制链接]

7657

回帖

86万

基友

34万

积分

天下一番

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

伯爵荣耀

发表于 2013-12-6 19:10:50 | 显示全部楼层 |阅读模式
要求:
用c/c++ 实现多项式加法
a0 + a1 * x + a2 * x^2 + ....

原型:
  1. int polyadd(int count, int x, ...);
复制代码
参考答案:
  1. int polyadd(int count, int x, ...)
  2. {
  3.         char *p = (char *)&x;
  4.         p += sizeof(x);
  5.         int sum = 0;
  6.         int tmp = 1;
  7.         for(int i = 0; i < count; i++)
  8.         {
  9.                 sum += *(int *)p * tmp;
  10.                 p += sizeof(int);
  11.                 tmp *= x;
  12.         }
  13.         return sum;
  14. }
复制代码
回复

使用道具 举报

2034

回帖

2万

基友

2万

积分

仙人7层 Lv.16

Invincible

Rank: 10Rank: 10Rank: 10

发表于 2013-12-6 20:23:26 来自手机 | 显示全部楼层
正好把va_list温习一下→_→
回复 支持 反对

使用道具 举报

2034

回帖

2万

基友

2万

积分

仙人7层 Lv.16

Invincible

Rank: 10Rank: 10Rank: 10

发表于 2013-12-6 21:41:18 来自手机 | 显示全部楼层
va_list没撸出来 还是用cs吧→_→
using System;
namespace polyadd
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(polyadd(5,5,1,2,3,4,5).ToString());
            Console.ReadKey();
        }
        static int polyadd(int count, int x, params int[] arr)
        {
            int ret;
            ret = arr[count - 1];
            for (count -= 2; count >= 0; count--)
            {
                ret = ret * x + arr[count];
            }
            return ret;
        }
    }
}

评分

参与人数 1妹纸 +5 基友 +10 收起 理由
龙 + 5 + 10

查看全部评分

回复 支持 反对

使用道具 举报

7657

回帖

86万

基友

34万

积分

天下一番

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

伯爵荣耀

 楼主| 发表于 2013-12-6 22:30:01 | 显示全部楼层
Liberty 发表于 2013-12-6 21:41
va_list没撸出来 还是用cs吧→_→
using System;
namespace polyadd

只要你理解栈的结构
其实不用va也能做
va宏不过是一堆指针操作罢了

我还是期待用c/c++写的答案
回复 支持 反对

使用道具 举报

427

回帖

431

基友

1585

积分

通神3段 Lv.6

Rank: 3Rank: 3

发表于 2013-12-6 23:01:35 | 显示全部楼层
回复 支持 反对

使用道具 举报

2034

回帖

2万

基友

2万

积分

仙人7层 Lv.16

Invincible

Rank: 10Rank: 10Rank: 10

发表于 2013-12-6 23:19:28 来自手机 | 显示全部楼层
龙 发表于 2013-12-6 22:30
只要你理解栈的结构
其实不用va也能做
va宏不过是一堆指针操作罢了

不理解,我还是用va吧→_→但是用va要改成这样→_→
int polyadd(int x,int count,...)
{
        va_list ap;
        va_start(ap,count);
        int c(0),ret;
        int *arr=new int[count];
        while(c!=count)
        {arr[c]=va_arg(ap,int);c++;}
        ret=arr[count-1];
        for(count-=2;count>=0;count--)
        {
                ret=ret*x+arr[count];
        }
        va_end(ap);
        delete[]arr;
        return ret;
}
int main(int argc,char *argv[])
{
        int i=polyadd(5,5,1,1,1,1,1);
        printf("%d",i);
        getchar();
}
回复 支持 反对

使用道具 举报

7657

回帖

86万

基友

34万

积分

天下一番

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

伯爵荣耀

 楼主| 发表于 2013-12-6 23:22:41 | 显示全部楼层
Liberty 发表于 2013-12-6 23:19
不理解,我还是用va吧→_→但是用va要改成这样→_→
int polyadd(int x,int count,...)
{

我能把你这个改一下么 = =
  1. int polyadd(int count, int x, ...)
  2. {
  3.    va_list va;
  4.    va_start(va, count);
  5.    int sum = 0,
  6.         tmp = 1;
  7.    for(int i = 0; i < count; i++)
  8.    {
  9.       sum += va_arg(va, int) * tmp;
  10.       tmp *= x
  11.    }
  12.    va_end(va);
  13.    return sum;
  14. }
复制代码
回复 支持 反对

使用道具 举报

2034

回帖

2万

基友

2万

积分

仙人7层 Lv.16

Invincible

Rank: 10Rank: 10Rank: 10

发表于 2013-12-6 23:31:50 来自手机 | 显示全部楼层
龙 发表于 2013-12-6 23:22
我能把你这个改一下么 = =

我智硬→_→不换数组脑袋转不过来
回复 支持 反对

使用道具 举报

4977

回帖

4万

基友

4万

积分

萨菲尔斯

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

伯爵荣耀

发表于 2013-12-6 23:33:41 | 显示全部楼层
夜,本帖隐藏的内容需要积分高于 99999999 才可浏览,您当前积分为 23649
回复 支持 反对

使用道具 举报

321

回帖

849

基友

1106

积分

通神3段 Lv.6

Rank: 3Rank: 3

发表于 2013-12-7 13:16:09 | 显示全部楼层
干什么的
回复 支持 反对

使用道具 举报

987

回帖

4561

基友

4503

积分

通神6段 Lv.9

Rank: 5Rank: 5

伯爵荣耀

发表于 2013-12-7 18:40:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

头像被屏蔽

23

回帖

62

基友

121

积分

禁止发言

伯爵荣耀

发表于 2013-12-8 12:16:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

936

回帖

7277

基友

7903

积分

会飞的醉颜

会飞的醉颜。

Rank: 13Rank: 13Rank: 13Rank: 13

二货勋章

发表于 2013-12-9 07:26:03 来自手机 | 显示全部楼层
秦九韶??
回复 支持 反对

使用道具 举报

272

回帖

60

基友

4270

积分

通神6段 Lv.9

Rank: 5Rank: 5

发表于 2013-12-13 16:08:27 | 显示全部楼层
1.#include <iostream>   
2.#include<algorithm>   
3.using namespace std;   
4.  
5.class Polynomial;   
6.class Term{//多项式的每一项   
7.    friend Polynomial;   
8.public:   
9.    float coef;//系数   
10.    int exp;//指数   
11.};   
12.  
13.class Polynomial{//多项式类   
14.    friend ostream & operator<<(ostream &o,const Polynomial & poly);   
15.public:   
16.    Polynomial();   
17.    Polynomial(const Polynomial & poly);   
18.    ~Polynomial();   
19.    Polynomial operator+(const Polynomial & poly);//多项式加法   
20.    Polynomial operator*(const Polynomial & poly);//多项式乘法   
21.    float Eval(float x);//数x代入多项式求值   
22.    void NewTerm(float coef,int exp);//添加一项,若有相同的指数项,则合并   
23.private:   
24.    void insertTerm(const Term & term);//项的有序插入   
25.private:   
26.    Term *termArray;//非零系数项数组   
27.    int capacity;//数组大小   
28.    int terms;//非零系数的项数   
29.};   
30.  
31.Polynomial::Polynomial()   
32.{   
33.    this->terms=0;   
34.    this->capacity=10;   
35.    termArray=new Term[this->capacity];   
36.}   
37.  
38.Polynomial::Polynomial(const Polynomial & b)   
39.{   
40.    this->terms=0;   
41.    this->capacity=b.capacity;   
42.    termArray = new Term[this->capacity];   
43.    for(int i=0;i<b.terms;i++){   
44.        NewTerm(b.termArray[i].coef,b.termArray[i].exp);   
45.    }   
46.}   
47.  
48.Polynomial::~Polynomial()   
49.{   
50.    delete [] termArray;   
51.}   
52.  
53.Polynomial Polynomial::operator+(const Polynomial & b)   
54.{   
55.    Polynomial c;   
56.    int aPos=0;   
57.    int bPos=0;   
58.    while(aPos<terms && bPos<b.terms){   
59.        if(termArray[aPos].exp == b.termArray[bPos].exp){   
60.            float coef=termArray[aPos].coef+b.termArray[bPos].coef;   
61.            if(coef)c.NewTerm(coef,termArray[aPos].exp);   
62.            aPos++;bPos++;   
63.        }else if(termArray[bPos].exp < b.termArray[bPos].exp){   
64.            c.NewTerm(b.termArray[bPos].coef,b.termArray[bPos].exp);   
65.            bPos++;   
66.        }else{   
67.            c.NewTerm(termArray[aPos].coef,termArray[aPos].exp);   
68.            aPos++;   
69.        }   
70.    }   
71.    while (aPos < terms){   
72.        c.NewTerm(termArray[aPos].coef,termArray[aPos].exp);   
73.        aPos++;   
74.    }   
75.    while (bPos < b.terms){   
76.        c.NewTerm(b.termArray[bPos].coef,b.termArray[bPos].exp);   
77.        bPos++;   
78.    }   
79.    return c;   
80.}   
81.  
82.Polynomial Polynomial::operator*(const Polynomial & b)   
83.{   
84.    Polynomial c;   
85.    for(int i=0; i<terms; i++){   
86.        for(int j=0; j<b.terms; j++){   
87.            float coef = termArray[i].coef*b.termArray[j].coef;   
88.            int exp = termArray[i].exp + b.termArray[j].exp;   
89.            c.NewTerm(coef,exp);   
90.        }   
91.    }   
92.    return c;   
93.}   
94.void Polynomial::NewTerm(float coef, int exp)   
95.{   
96.    if(terms == capacity){   
97.        capacity *= 2;   
98.        Term *tmp = new Term[capacity];   
99.        copy(termArray,termArray+terms,tmp);   
100.        delete [] termArray;   
101.        termArray = tmp;   
102.    }   
103.    Term ATerm;   
104.    ATerm.coef=coef;ATerm.exp=exp;   
105.    insertTerm(ATerm);   
106.}   
107.void Polynomial::insertTerm(const Term & term)   
108.{   
109.    int i;   
110.    for(i=0; i<terms && term.exp<termArray[i].exp; i++){   
111.    }   
112.    if(term.exp == termArray[i].exp){   
113.        termArray[i].coef += term.coef;   
114.        if(!termArray[i].coef){   
115.            for(int j=i; j<terms-1; j++)   
116.                termArray[j]= termArray[j+1];   
117.            terms--;   
118.        }   
119.    }else{   
120.        for(int j=terms-1; j>=i;j--)   
121.            termArray[j+1]=termArray[j];   
122.        termArray[i] = term;   
123.        terms++;   
124.    }   
125.}   
126.  
127.float Polynomial::Eval(float x)   
128.{   
129.    float res=0.0;   
130.    for(int i=0;i<terms; i++){   
131.        res += termArray[i].coef * pow(x,termArray[i].exp);   
132.    }   
133.    return res;   
134.}   
135.  
136.ostream & operator<<(ostream & o,const Polynomial & poly)   
137.{   
138.    for(int i=0;i<poly.terms-1;i++){   
139.        o<<poly.termArray[i].coef<<"x^"<<poly.termArray[i].exp<<" + ";   
140.    }   
141.    o<<poly.termArray[poly.terms-1].coef<<"x^"<<poly.termArray[poly.terms-1].exp;   
142.    return o;   
143.}   
144.  
145.void test()   
146.{   
147.    Polynomial p1;   
148.    p1.NewTerm(3,2);   
149.    p1.NewTerm(2.1,3);   
150.  
151.    Polynomial p2;   
152.    p2.NewTerm(1,2);   
153.    p2.NewTerm(1,3);   
154.    p2.NewTerm(5,1);   
155.  
156.    cout<<"("<<p1<<") + ("<<p2<<") = "<<p1+p2<<endl;   
157.    cout<<"F(x=2) = "<<(p1+p2).Eval(2)<<endl;   
158.    cout<<"("<<p1<<") * ("<<p2<<") = "<<p1 * p2<<endl;   
159.}   
160.  
161.int main()   
162.{   
163.                test();   
164.                system("Pause");   
165.                return 0;   
166.}  
回复 支持 反对

使用道具 举报

99

回帖

222

基友

513

积分

通神1段 Lv.4

Rank: 2

伯爵荣耀

发表于 2013-12-16 22:18:03 | 显示全部楼层
能用易语言做吗
回复 支持 反对

使用道具 举报

26

回帖

53

基友

149

积分

凡人2阶 Lv.2

Rank: 1

发表于 2014-1-7 15:17:18 | 显示全部楼层
还好吧
回复 支持 反对

使用道具 举报

2034

回帖

2万

基友

2万

积分

仙人7层 Lv.16

Invincible

Rank: 10Rank: 10Rank: 10

发表于 2014-4-22 19:19:35 | 显示全部楼层
原来如此
While the truncheon may be used in lieu of conversation words will always retain their power.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|苍海国际 ( 鲁ICP备13020644号-1 )

GMT+8, 2024-11-22 06:39 , Processed in 0.064318 second(s), 31 queries .

Powered by Discuz! Theme By eRic Modified by 4bpa

© CangHai International We Do Our Rights!

返回顶部