放弃,才有所得。

     觉得自己在技术上又到了一个必需放弃一些东西的时候了
  前段时间学了保护模式编程,就有用WinGDB调试WIN内核,了解一下其内部实现的冲动,也有看看FreeBSD的代码,自己实现一个支持保护模式,多任务,虚拟内存的简单os的冲动.
       一直很喜欢编译技术,现在在用lua语言,又有看看lua源代码的冲动。想研究语法和语义,就想看看和面向过程,面向对象完全不同思想的函数式语言,就又有想学lisp的冲动.
       也经常做破解方面的东西,也很想投入精力做更深入的研究。
  对算法也非常感兴趣,还计划要看的书多,多,多。。。
       自己在做网络游戏,对游戏服务器编程还要学的东西也是多,多,多。。。

       这样不行,时间上不够不说,精力也分散了,是有必要放弃一些东西,我的目的不是学得大些全,而是在某个领域投入所有的时间,经过n年的学习和研究,要做到国内顶尖。
      实际上我在自己的学习上已经有过二次放弃了,第一次是在98年,刚学计算机的时候,那个时候什么都学,什么都有兴趣,编程,硬件知识,图形处理等等。。。后来觉得不行,坚定了只做编程的决定
  第二次是在02年左右,那时候编程的语言我也学过过多,各种技术也接触过一些,后来放弃了delphi,java,专心只学汇编,C++,数据结构和算法。
       现在面临的诱惑又多了,我要先整理一下自己的思路,放弃一些技术,列出自己的学习计划。
  有放弃,才有所得。

### 实现多项式乘法的C/C++程序 为了实现多项式乘法运算,可以采用链表来存储多项式的每一项。以下是完整的解决方案: #### 数据结构定义 首先定义一个节点结构体用于表示多项式的每项。 ```c typedef struct Node { int coef; // 系数 int expn; // 指数 struct Node* next; } PolyNode, *Polynomial; ``` 此结构体`PolyNode`包含三个成员:整型变量`coef`代表系数;整型变量`expn`保存指数;指针`next`指向下一个结点[^1]。 #### 创建新节点函数 创建一个新的节点以便于后续的操作。 ```c PolyNode* CreateNode(int c, int e) { Polynomial p = (Polynomial)malloc(sizeof(PolyNode)); p->coef = c; p->expn = e; p->next = NULL; return p; } ``` 该函数接收两个参数——系数和指数,并返回初始化后的节点地址[^2]。 #### 输入多项式 通过键盘输入构建多项式链表的方法如下所示: ```c void InputPoly(Polynomial &P){ P = NULL; while(true){ printf("请输入系数(-999结束): "); scanf("%d", &(newTerm.coef)); if(newTerm.coef == -999) break; printf("请输入指数: "); scanf("%d", &(newTerm.expn)); InsertTerm(&P, newTerm); } } ``` 这段代码不断提示用户输入直到遇到特定终止条件为止,在这里是以-999作为标志位停止录入新的项。 #### 插入单项至链表中 每当获取一对有效的系数与指数之后,则需将其加入到已有的链表里去。 ```c void InsertTerm(Polynomial *pRear, Term t){ Polynomial TmpCell = CreateNode(t.coef,t.expn); (*pRear)->next = TmpCell; *pRear = TmpCell; } ``` 上述过程会把最新得到的数据封装成独立单元附加在当前列表末端。 #### 多项式相乘算法 对于给定的两个一元稀疏多项式A(x), B(x),其乘法规则遵循分配律展开原则。 ```c Polynomial Multiply(Polynomial pa, Polynomial pb){ Polynomial resultHead = CreateNode(0, 0); // 初始化结果头结点 Polynomial rear = resultHead; for (;pa != NULL ; pa=pa->next){ // 遍历第一个多项式 Polynomial temp = pb; while(temp!=NULL){ InsertTerm(&rear, {temp->coef * pa->coef , temp->expn + pa->expn}); temp=temp->next; } } MergeSort(resultHead->next); // 对最终的结果进行排序处理 free(resultHead); // 清理临时使用的头部哨兵 return rear; } ``` 此处实现了遍历两棵链表并将对应位置上的元素按照乘法法则组合起来形成新的序列。 #### 合并相同幂次项 由于可能存在重复次数的情况所以还需要额外一步整理工作即合并相同的幂级。 ```c void MergeSort(Polynomial head){ std::map<int,int> mp; while(head!=nullptr){ auto it = mp.find(head->expn); if(it==mp.end()){ mp.insert({head->expn,head->coef}); }else{ it->second += head->coef; } head=head->next; } // 将哈希映射中的键值对重新构造成有序单向链表... } ``` 利用标准库容器std::map自动完成查找、累加同阶项的任务简化了逻辑复杂度。 #### 输出多项式表达式 最后提供一种直观的方式展示计算所得的新多项式。 ```c void OutputPoly(Polynomial poly){ bool isFirst=true; for(;poly!=NULL;poly=poly->next){ if(poly->coef==0 || (!isFirst && poly->coef<0)) putchar('-'); else if(!isFirst&&poly->coef>0)putchar('+'); if(abs(poly->coef)!=1||poly->expn==0) printf("%dx^%d ",abs(poly->coef),poly->expn); else if(poly->expn==1) printf("%sx ", abs(poly->coef)==1?"":""); isFirst=false; } puts(""); } ``` 以上方法能够优雅地呈现带有正负号及省略形式的一般化数学公式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值