本来这个blog是不准备写个人心情的,但是最近事情太多,就准备一点一点都说出来吧。

两周前书包丢了,总共丢了一个包+一手机+各种准备留给下一届的卷子实验报告+几本教材+各种证书+iriver e300+森海mx760(土匪送的),损失太大,无法准确估计,粗略估计1.5k~2kRMB,最近没法好好听音乐了,实在舍不得再去买个MP3了

学术方面,一个是自己早就失去了对所有学科的兴趣,考试考砸了也早就不在乎了,但很明显比某些人考好了又会有虚荣心;另一方面,去PRIS@BUPT去做自己兴趣不大的事情,感觉有点悲伤,但还是得先做下去。争取今年拿个好项目吧。

AM的ToVocaH就这么过去了,真的很开心但也有遗憾,争取7月份努力练回来。弄不好是时候买一个双踩和一副镲片了。清明预订写个乐队一周年的总结blog。

经历远比结果重要,做过什么还是比做出什么更值得回忆的。做最好的自己但这与我想做其他事情不矛盾。越来越觉得一番の宝物的歌词万能了,但是上乐队又会毁神曲,等以后告别时再用吧。

清明各种补:海猫,各种一月番,老番,见老师什么的。只能让自己加油了。

 

11的新人们太凶残了,完全不知道从何下手。。。

ARENA 01: 黑卡蒂 神乐 [佐天泪子]

ARENA 02: [柊镜] 菈菈・沙塔琳・戴比路克 龙宫蕾娜

ARENA 03: [平泽唯] 朽木露琦亚 栉枝实乃梨

ARENA 04: [我妻由乃] 鹿贺凛 巴麻美

ARENA 05: [岩泽 麻美] 森岛遥 雷姬

ARENA 06: [Abstained] 如月千早 温蒂 楪祈

ARENA 07: 朝比奈实玖瑠 羽川翼 [翠星石]

ARENA 08: 谏山黄泉 金色暗影 [冈崎汐]

ARENA 09: 黑沼爽子 [最后之作] 玛利亚

ARENA 10: [赤座灯里] 白婭 濑名爱理 咦?我刚才投了谁?

ARENA 11: 鹿目圆 筱宫绫濑 [东云名乃]

ARENA 12: 押水菜子 藤和艾莉欧 [上野锥霞] 班长我爱你啊~

ARENA 13: 阎魔爱 [平泽忧] 樱野栗梦

ARENA 14: [古手梨花] 伊卡洛斯 初春饰利

ARENA 15: [伊莉雅斯菲尔•冯•爱因兹贝伦] 木之本樱 真红

ARENA 16: 天海春香 [爱丽丝菲尔•冯•爱因兹贝伦] 筱之之箒

ARENA 17: [安城鸣子] 凉月奏 岁纳京子

ARENA 18: [松前绪花] 美树沙耶加 中川花音

ARENA 19: [Abstained] 菲特·T·哈洛溫 川澄舞 椎名真冬

ARENA 20: [藤林杏] 花户小鸠 神裂火织

ARENA 21: 赫萝 日向雏田 [两仪式]

ARENA 22: 天羽美羽 菲雅 [赫莱森.阿利亚达斯特 (P-01s)]

ARENA 23: 星井美希 [星伽白雪] 汐宫栞

ARENA 24: 近卫昴 [椎名真由理] 高仓阳毬 差点选小毛球

 

昨晚(今早?)睡不着觉,就开始想下学期要学的概率论的那些事了,想着想着就想到了著名的山羊与汽车的问题

大意是这样,某电视节目里有这样的场景:三个门后面随机地放有两只山羊和一辆汽车。参赛者可以随机选出一扇门(当然目标是汽车不是山羊);当选手做出选择后,知道车具体在哪扇门后的主持人打开一扇后面有山羊的门。这是选手可以选择更换自己的选择或者不换。问题是,做出哪一个选择后更容易的到汽车呢?

大多数人都会这样思考问题:在主持人打开有山羊的门之前,选手拿到汽车的概率为1/3;而主持人排除一个错误选项后;相当于在两个里面随机抽一个,概率也就变成1/2了,因此换与不换的概率是一样的;都是1/2。昨晚我大概就是这么想的,但又知道答案是换比不换好,因而纠结了好久……

接下来我们试着编个程序来模拟下这个过程:

#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main(){
  int car,choice,change,no_change,open;
  change=0;no_change=0;
  int a[3],goat[2];
  srand(time(NULL));
  cout << "#tchoicetcartopentchangetno_changen";

  for (int t=0;t<500;t++){
    for (int i=0;i<3;i++) a[i]=0;
    choice = rand()%3;
    car = rand()%3;

    a[car] = 1;
    goat[0] = (car+1)%3;
    goat[1] = (car+2)%3;

    if (choice == car){
      open = goat[rand()%2];
      cout << t << "t" << choice+1 << "t" << car+1 << "t" << open+1 << "tt*n";
      no_change++;
    }
    else{ // choice <> car
      if (choice == goat[0]) open = goat[1];
      else open = goat[0];
      cout << t << "t" << choice+1 << "t" << car+1 << "t" << open+1 << "t*n";
      change++;
    }
  }

  cout << "============================n" << "Sum: n" << "Change: " << change << "nNo_change: " << no_change << "n";
}

我设置的模拟次数是500,结果表示,换选项成功345次,不换成功155次。具体结果在这里(txt)。

接着做两个解释:

1.正确答案是什么

其实透过代码我们也可以知道这里应该分为两种情况讨论:

(1)如果我们第一次就选中了汽车(这里的概率是1/3),那么主持人会随机从两只山羊里选出一只。这是显然如果换了就错过汽车了,应该不换;
(2)如果我们第一次选择山羊(这个概率为2/3),那么主持人一定会打开另一删后面有山羊的门;这是剩下最后一扇门后面就一定是汽车。这是更换选项就会成功。

因此,更换是否成功完全在于第一次是否选错,那么概率也就是2/3。

 

2.为什么1/2是错误的这里我们可以再回到上面看一下那个通俗的错误解释。“主持人排除一个错误选项后;相当于在两个里面随机抽一个,概率也就变成1/2了”而实际上,这里显然选手没有再次做随机选择的能力,而只是选择“换”或者是“不换”。比如说,如果参赛者知道答案,它第一次一定能选中汽车的话,那么第二次机会即使看起来是“在两个里面随机抽一个”,不换的概率就是1;而不是1/2。可以说,这个错误的解释里混淆了概率与结果。
如果还是很难理解的话,可以把问题抽象成小球并扩展到5(n)个。假设有4个白球1个黑球,当随机抽出一个后,确定地拿出3(n-2)个白球。那么剩下的那个没被拿走的球是黑球的概率不就是第一次抽到白球的概率,也就是4/5(1-1/n)了。

 

这个问题也有人叫做玛丽莲问题,因为这个问题是因为世界上智商最高的人玛丽莲给出了违反直觉的正确解答后才引起广泛的讨论的。这里是她的网站上记录的讨论,可以看到无数的PhD倒在的这里……

原创文章,欢迎分享。

 

欢迎吐槽

一年又过去了,本来这篇日志应该在三星期前就写完了,但一直拖着没写。不过当真正想写的时候,却又发现要写的太多,反而不知道从哪里开始写起了。我一直坚信经历比结果重要,而这一年真的经历了好多,真的很感谢学生会,乐团、乐队的民那和在我身边的所有人。

学术:

不想说太多,因为今年课余生活实在太丰富,倒是这两学期完全没挂科的结果让我很惊讶。随着这两学期学完,文科的东西越来越少,本应该静下心来好好学一学,但最后发现这不过是自己的YY。看了一下下学期的数电教材(感觉比模电不知道高到哪里去了),发现里面的很多东西就是我高考后想看的,果然自己想过的东西前人都做好了。而之前想做成创新实验项目的一个3D眼镜也有人做了(http://audio.pconline.com.cn/mp4/review/1111/2587383.html),另一个wiki虽然有点头绪,但很明显是做不下去的,真想套现的话可能还是移动开发比较好。最后感觉还是专心研究模式识别吧,我们专业估计就指望这个活呢,数模什么的虽然可能用不上,但还是找个理由看看神经网络比较好(//不过按照我们数据结构老师的说法,Lisp做的砖家系统没前途……)

 

Geeky的方面:

这一年这的变成死宅了,原来会的东西现在也不会了,跟Dage和玉帝比我真的弱爆了。院会面试的时候还说过一个学妹很Geeky,到最后却发现自己连说Geeky的资格都快没有了。自《三体三》之后我就几乎没再看过什么科幻作品,好多挂着科幻名号的作品也不过是借着科幻的背景而已。不过抛开科幻因素这些作品也确实不错,比如Level-E和境界线。CS方面只是把C学会了,写了个php+MySQL的投票系统还有学长帮忙,正是因为此才有了网络部的福利。网站也快一年了,里面却什么都没有,可惜总写杂文也没人看啊。话说回来,归根结底还是自己整天不干正经事,很多时间浪费在SNS上,说真的期中考试之后不用i5700了上课效率高了好多。。。

 

ACGMN:

想说的有好多,但又怕占太多地方。。。总的来说,我恰好是从去年这个时候还是追季番,一周一集,看的是宽叔成名作FRACTALE(然后就发现被所谓的科幻背景坑了)。接着就是三月份开始加了乐队,这时我的三次元生活也开始丰富了起来。在乐队不小心(?)cos了两回伪娘,黑历史什么的连自己都找不到了。接着就是5月份去漫展见到了@AstroProfundis,8月份在沈阳的漫展见到了中岛爱唱了四五首歌,买了三本轻小说(然后前天才读完第一本《神様のメモ帳》……)。9月的AM3个人感觉相当成功,在麻雀瓦舍感觉人生都变得完整了。

就整个这一年看过的番組来说,石头门是给我印象最深的(可惜游戏还没汉化),看起来小圆这种风格的作品是趋势啊;音乐方面则恰好是一年前的除夕那天看了B站上的《xxx神曲xxx》开始接触各种ACG Music,也有很多因为觉得OP/ED/插曲好听才开始看的动画;游戏除了为了看FZ把FSN玩了之外没啥其他收获;漫画则是前两天期末考试前把《未来日記》看了。ACGMN全了

 

epilogue:

“一年好快啊~”,但这一年所发生的事和所认识的人真的比想象的要多好多。记得去年第一天写日志的时候用了一番の宝物和Brave Song的歌词,这次却完全找不到能形容我现在心情的曲子……用glassware这个钢琴曲吧,现在的心情其实很平静,但也有人说这曲子很悲伤。。。
    ←不要吐槽这个的大小就行。。。

PS:本来以为假期没事干,闲的时候能练练鼓,最后也找到玩的了。这假期真充实啊,平均两天自己出一次门……

PS2:某些人真不咋地

 

2011.12.17 @壹空间‘The One’ Live House

又是AM,大家又聚在了一起,燃极而泣是必不可少的,这次也不例外。みんな、ありがとうございました!

接下来贴视频,然后从非专业鼓手+死宅的角度挨个吐槽。


Only My Railgun的TV Size,本身是试音的曲子,没想到也能提起气氛。(这么一说有点毁神曲的感觉……)


残酷な天使のテーゼ,没想到这个也能大合唱,曲子本身不复杂,最轻松的曲子了。貌似Bridge的那段筱夜和菲口的声音比例不太对啊。。。


help me erinnnnnn!!!!!!超燃的曲子,民那都说我给拍子给得太快了。。。(实际上我觉得这个速度在现场刚刚好啊)
最累的就是脚,打完这个腿真的好酸……
又因为之前喝了罐红牛,结果就被吐槽“未成年人禁止喝红牛”……


最后一曲,乐队的民那应该都感觉这曲子不完美吧。鼓表示打到27秒时鼓槌掉了,到最后又发现另一根鼓槌折了……苦逼啊……
其实回来看视频感觉这个偏快,相对而言感觉erin的速度还好,不过因为种种事故试音的时候BRS巨快无比,导致大家感觉都还不错(只是相对的)

就说这些吧,还有什么想吐槽的大家尽管在下面回复啊。最后BRS真的感觉很不完美,也得给大家道个歉。不过听在下面听的人说整体气氛还不错,这样的话也真的很感谢观众们,感谢你们的支持。
明天3月有东方V家专场,到那时我也到这个乐队一年了,等百合祭结束我在写点别的东西吧。

2011.12.19 By Andy

ps. 实际上是因为筱夜写了我才写的……

 

这品文章就是用来测试html5的<rt>标签,就不要吐槽了。

桜色
歌:竹井詩織里
作詞:AZUKI七 作曲:桂花 編曲:小林哲

もうきみ毎日まいにちのように かけることもないでしょう
いまきみと ともりし日々ひびに おもいをめぐらせる
 
おもは かさなって またいつかえる
どれぐらい おぼえていれるでしょうか
わかれのせつなさに またひともと
いを かえすのでしょう

 
さくらいろ かぜにおどれば たびちのを やさしくつつんだ
なみだおぼえしせつめてえてゆく
あわひかりのよう さきへゆきなさい…
 
ひとれず きみんだ こともきっとつたわるよ
いあがれ きみらいよろこびにつながるよう
 
うしなわず なみだなく つよくなれたら
いいのにね なんてもどかしいの
ひとそだために こころれるような
ちを あじわうのでしょうか
 
さくらいろ しんじるものは おもうよりもろく れぬもので
とおはなれてゆくひとをつなぐあわゆめのようにかがや
あこがれまじりで
 
あいのうたがこえてきたら
ひとぬくもりをおもうのです
だれかがだれかをおもっているよ
こんなにあふれてる
 
さくらいろ かぜにおどれば たびちのを やさしくつつんだ
なみだおぼえしせつめてえてゆく
あわひかりのよう さきへゆきなさい…
 
 

作者蒋方舟最想要表达的就是对学校不满,对学校的学生不满。清华是人们公认的大陆工科顶级学校,相比之下,北邮的学生有什么见解似乎都不会有太多的影响力。然而,事实上却是,人们是否去思考与他所在的学校无关,人们是否拥有最基本的素养与考试成绩无关(不是逆相关,我没有贬低成绩好的同学的意思)。

大学乃修学之地,这里人物形形色色,人各有志,不想专心学术也无妨,只是纳税人的钱可能会尽不到作用而已。然而,当这种思想成为大学里的主流思想时,问题就变得可怕了。如果一个人没有一个目标的话,这个人一定是没法真正去学习一些东西的。又因为我所遇到的北邮的大多数老师不是念课本就是读ppt,与我在中学时幻想的大学课堂大相径庭,甚至还要更古板。而大多数学生的想法也只是不挂科,为了好成绩的人似乎也只是为了那些好成绩能带来的东西,根本不在乎是否真正理解了老师所讲的内容,是否真的学会了这些知识。更重要的问题则是作为判断学生是否学到知识的考试也是对这些人有利的。这样的恶性循环体现出来就是:

A:“这块为啥这样做啊?”

B:“你不用管,背结论就行”

再接下来A有两种可能,一种是自己纠结着或者说服别人跟他一起纠结,并最终找到答案;另一种则是被其他人同化,最终失去真正求知的心。这只是一个简单的例子,但却很可能是问题的核心:当我们想去思考的时候,周围的人在阻碍我们思考。不去思考,怎么可能称得上是学术,怎么可能最后得出真正的学术成果?上面例子的延续就是等我们大学毕业后,更多的人想的不是如何用知识去创造财富,而是如何用所谓的世故来“混”社会。并且这些人把自己的世故当作成熟,把别人的思考当作幼稚。

上面只是一个简单的例子,不过不管怎么样,殊途同归,大多数人都会被同化,并成为体制的维护者。我们这个年龄的人大多数都会抱怨现在这个社会,但没有任何人有勇气去改变这个社会,包括我自己。就像蒋方舟文章里面说的那样,如果是既得利益者,尽力去维护自己已经得到的利益也就罢了,问题是还有许多利益被剥夺的人,他们竟然也会去维护这种体制,让自己曾经的悲剧延续下去,嘴里还振振有词:“反抗是没有意义的”。是啊,这些人即使真的去反抗又有什么意义,因为即使这些人反抗成功了,社会到最后也还是这个样子。甚至在我们学生群体里,这样的人也很常见:嘴里骂着政府,却整天梦想着能不劳而获得到公务员的职务。嘴里骂着贪官,心中却在意淫着当上了贪官怎么能贪到更多的钱。包括我自己,都应该问自己这样一个问题,如果我是统治者,我能不顾那些贪官的反对,真正地维护公民的利益吗?我是公民的话,我又能保证为了自己的利益而尽力不去损害他人的利益吗?

最后说一下那个《盛世》这本书,说实话看完之后真的觉得很震惊,但文中所写却又似乎就是我们身边正在发生的事实。文中的那段“他们不这么想就更可怕了”,说的就是中国人自古以来就有的双重思想。我们所接受的教育,从小就教我们作假,似乎没有双重思想的人反而是社会的异类,一面骂着别人,一面又奉承着别人;最后的结果也只能是不自然地维护着这个体系。不过,如果这真的像《1984》里面的双重思想倒还好,至少他们思考了并且得出了自己的结论,不管正确与否,总比《1984》里面的反乌托邦真正期望的让人不去思考要强。

ps:这个只是马哲的作业,说实话我还是喜欢打字而不是写字,可惜如果我真的打印出来,老师一定会认为我是从网上摘抄的吧。不过话说回来,这个老师敢于这么留作业我就已经很钦佩了。大学生如果都能有像李刚老师那样的基础知识的话,不管他们得到的结论如何,总比现在要强。(这段话不会出现在手写版本里)

ps2:好久没有写这类文章了,不过这次自己还算满意。

 

本文原创,转载请注明出处: http://atarss.com/blog/?p=193

计科无能者无视第一段,着急写作业的建议不用看第三部分,直接用第二段的方法。

 

KMP的实质是自动机匹配的优化,即不需要构造自动机,而通过模式字符串的自我匹配来简化过程,使预处理的时间复杂度降为O(m)。

1.字符串匹配的过程;以及为什么我们能优化算法

假设要被搜索的字符串是”bacbababaabcbab”,要搜索”ababaca”这个串。

浅绿色的表示已经被匹配的字符,我们定义正在被匹配的长字符串里面的位置是i=5,要搜索的模式串已经匹配到j=6第6个字符而且与原始的字符串不匹配。按照朴素的匹配算法,我们应该让i++,即从i=6开始匹配。但是我们已经知道i从5~9与B串的j=1~5是完全相同的。因此即使我们不知道A串的内容,只通过B串的内容以及我们已经匹配到第6个字符这两项数据,就可以知道从i的下一项数据一定是不匹配的。

 

同理我们知道主串在i=7时的匹配可能是成功的,因此我们可以设计算法不去匹配i=6时的情况而直接跳到i=7去匹配,而且右移2位这个数字2只是通过B串(要搜索的串)的自我匹配来完成的,也就是可以在匹配前完成计算。而这就是KMP较朴素匹配算法的优化之处。

2.如何计算当不匹配时主串要移动多少位

依旧要搜索这个串”ababaca”,我们已经知道要跳过多少个字符的字符数量是与要搜索的字符串(A串)无关的,实质是要搜索的串(B串)的自我匹配。而这个信息可以被预先计算出来并被存储起来。

每次偏移多少位显然与匹配到B串第几个字符时开始不匹配的j位置有关,因此我们定义一个数组来存储这个偏移量的信息,定义为D[1..t],t为B串的长度,下标从1开始。

※我们前提假设,每个字符只能读取一次,真正的字符指针不能后退。

实质即为,假设当匹配到j=n时不匹配,即j从1~(n-1)都是匹配的,那么偏移量就是字符串从后向前自我匹配时到达前面之前所能达到的最大的位置。举例:

按找从下往上看的顺序就能找到偏移量,显然最长的匹配的偏移量为2。按照这种方法就能找到所有的偏移数组的值。

若j=1时不匹配,毫无悬念,偏移量为1,;
若j=2时不匹配,则右移一位也没有意义,直接右移两位,偏移量为2;
若j=3时不匹配,i=3与j=1时相同,因此偏移量为3-1=2;

若j=4时不匹配,同理得偏移量为2;
j=5时上面已经分析过,偏移量为5-3=2;
j=6时,同理,偏移量为6;
j=7时,偏移量为7-1=6;

在计算的过程中,我们知道,真正找到的并不是偏移量,而是最长真字串的长度。我们成这个关于j的数组(函数)为前缀函数Pi[j]。

3.前缀函数的递推计算

根据上面的算法,我们同时得到前缀函数的值

下面说明递推的过程:
假设我们已经知道了j=1~4时Pi[j]的值了,如何推得Pi[5]和Pi[6]呢?

Pi[4]=2,说明字符串B[1..2]与B[3..4]相同,又B[5]==B[3],所以,P[5]=P[4]+1=3;

而Pi[6]却不等于Pi[5]+1,这是因为B[4]≠B[6],因此没法通过Pi[5]+1得到Pi[3],但同时,B[1],B[3],B[5]均为字符’a’,或许还可能通过Pi[3]或Pi[1]得到Pi[6],但一次次匹配都发现B[6]不等于B[4]且B[6]不等于B[2],这时,Pi[6]只能是0。

抽象一下,就得到Pi[j]的算法:
先用一个临时变量T=Pi[j-1]
若B[T] == B[j],那么Pi[j] = Pi[j-1]
否则,T=Pi[T],继续上面的操作,直到Pi[T] == 0,这时Pi[j]=0。

最后附上计算Pi[6]的示意图:

 

最后一部分参考了M67的文章,在此对其表示感谢。

http://www.matrix67.com/blog/archives/115

 

编了一个纯尾递归的函数,主要是强调Lisp的函数式编程吧
gcl2.6通过

(defun goodbye (num list)
(if (eq (length list) 0) num
(goodbye (char-code (print (code-char (+ (car list) num)))) (cdr list))
))

调用 (goodbye 71 '(0 40 0 -11 -2 23 -20))

纪念John McCarthy,您才是我心目中的大神。 或许AI是所有老一辈计算机科学家的最终目标吧。

 

只是数据结构的作业而已,里面用了STL的set和list,放在这里主要是有高亮。
功能是计算两个多项式的和,输入格式是下x^3-6x^2+3这样最简单的字符串,不需要排序,也就是2+3-4+x^100-x^50这样的形式也是可以的。

/*
 * Language : c++
 * Compiler : Linux/gcc-g++ (GNU Compiler Chain)
 * Code by : Andy (Liu Yuxuan)
 * Date 2011-10-07
 */

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <list>
#include <string>
#include <set>
#include <fstream>

const int SORT_ORDER=1;
// 1 for ascending order
// 0 for descending order

struct monomial {
    int num;
    int exp;
} ;

int get_poly_numbers(std::string & str) {
    int _s=1;
    for (int i=0;i<str.length();i++) {
        if ((str[i] == '+') || (str[i] == '-')) _s++;
    }
    if ((str[0] == '+') || (str[0] == '-')) _s--;

    return _s;
}

void explict_opr_pos(std::string str,std::set<int> & _set) { // set '+' or '-' as seperator
    _set.clear();
    for (int i=0;i < str.length();i++) {
        if (!((str[0] == '+') || (str[0] == '-'))) _set.insert(0);
        if ((str[i] == '+') || (str[i] == '-')) _set.insert(i) ;
    }
}

int explict_num(std::string & poly_str) {
    using std::string;

    int num;

    int x_exist = 0,x_pos;
    for (int i=0;i<poly_str.length();i++) {
        if (poly_str[i] == 'x') {
            x_pos = i;
            x_exist = 1;
        }
    }

    if (x_exist) {
        string poly_num_str (poly_str.begin(),poly_str.begin()+x_pos);
        if ((poly_num_str.length() == 1) && (poly_num_str[0] == '+' || poly_num_str[0] == '-')) {
            if (poly_num_str[0] == '+') num = 1;
            if (poly_num_str[0] == '-') num = -1;
        }
        else {
            if (poly_num_str.length() == 0) num = 1;
            else num = atoi(poly_num_str.c_str());
        }
    }
    else {
        num = atoi(poly_str.c_str());
    }

    return num;
}

int explict_exp(std::string & poly_str) {
    using std::string;

    int exp,x_exist=0,exp_exist=0,exp_pos;
    for (int i=0;i<poly_str.length();i++) {
        if (poly_str[i] == 'x') x_exist=1;
        if (poly_str[i] == '^') {
            x_exist = 1;
            exp_exist = 1;
            exp_pos = i;
        }
    }

    if (x_exist == 0) exp=0;
    else if (exp_exist == 0) exp=1;
    else {
        string child (poly_str.begin()+exp_pos+1,poly_str.end());
        exp = atoi(child.c_str());
    }

    return exp;
}

void explict_str(std::string str,std::list<struct monomial> & poly_list,std::set<int> _set) {
    using std::set;
    using std::string;
    using std::list;

    poly_list.clear();
    set<int>::iterator set_it_begin,set_it_end;
    set_it_begin = _set.begin();
    set_it_end = ++set_it_begin;
    set_it_begin--;

    int num = get_poly_numbers(str);
    string::iterator str_begin_pos = str.begin();
    for (int i = 0;i<num-1;i++) {
        int begin_pos = *set_it_begin;
        int end_pos = *set_it_end;
        string child_str (str_begin_pos+begin_pos,str_begin_pos+end_pos);

        struct monomial mono;
        mono.exp = explict_exp(child_str);
        mono.num = explict_num(child_str);

        poly_list.insert(poly_list.begin(),mono);

        set_it_begin++;
        set_it_end++;
    }

    string child_str (str.begin()+*(set_it_begin),str.end());
    struct monomial mono;
    mono.exp = explict_exp(child_str);
    mono.num = explict_num(child_str);

    poly_list.insert(poly_list.begin(),mono);
}

void delete_zero_of_poly(std::list<struct monomial> & poly) {
    using std::list;
    list<struct monomial>::iterator _t;

    for (_t = poly.begin(); _t != poly.end(); _t++) {
        if (_t->num == 0) {
            poly.erase(_t);
            _t = poly.begin();
        }
    }
}

void add_poly_to_sum(std::list<struct monomial> & poly,std::list<struct monomial> & sum) {
    using std::list;

    int len = poly.size();
    for (int i=0;i<len;i++) {
        int _exp = (poly.begin())->exp;
        list<struct monomial>::iterator sum_t = sum.begin();
        while (_exp != sum_t->exp) sum_t++;
        sum_t->num += (poly.begin())->num;
        poly.erase(poly.begin());
    }
}

void output_poly(std::list<struct monomial> poly) {
    using std::list;
    using std::cout;

    cout << "n";
    if (poly.size() == 0) cout << "0";
    else {
        list<monomial>::iterator _t = poly.begin();
        for (int i=0;i<poly.size();i++)
        {
            int num = _t->num ;
            int exp = _t->exp ;

            if (i == 0) {
                if ((num == 1) && (exp > 0)) ;
                else if ((num == -1) && (exp > 0)) cout << "-";
                else cout << num;
            }
            else {
                if (num > 0) {
                    cout << "+";
                    if (num != 1) cout << num;
                }
                else /* num <0 */ {
                    cout << "-";
                    if (num != -1) cout << num;
                }
            }

            if (exp > 1) cout << "x^" << exp;
            else if (exp == 1) cout << "x";

            _t++;
        }
    }
    cout << "n";
}

int main(int argc, char **argv) {

    using namespace std;

    string str_1,str_2;
    int num_of_mono_1,num_of_mono_2;
    set <int> set_1,set_2; //store the positin of '+' or '-'
    set <int> exp_set; // store the exps
    set<int>::iterator set_t;
    list<string> p_str_1,p_str_2;
    list<struct monomial> polynomial_1,polynomial_2,polynomial_sum;
    list<struct monomial>::iterator _t;
    exp_set.clear();

    string choice;
    printf("Input from screen(s) or file(f)[s]:");
    getline(cin,choice);
    if (choice == "f") {
        string file_name;
        cout << "Input file name: ";
        getline(cin,file_name);
        ifstream fin;
        fin.open(file_name.c_str());
        getline(fin,str_1);
        getline(fin,str_2);
        fin.close();
    }
    else {
        cout << "Input the first polynomial of 'x':n";
        getline(cin,str_1);
        cout << "Input the second polynomial of 'x':n";
        getline(cin,str_2);
    }

    explict_opr_pos(str_1,set_1);
    explict_opr_pos(str_2,set_2);

    explict_str(str_1,polynomial_1,set_1);
    explict_str(str_2,polynomial_2,set_2);

    set_1.clear();  // num & exp have been already seperated.
    set_2.clear();  // clear the sets

    _t = polynomial_1.begin();
    for (int i=0;i<polynomial_1.size();i++) {
        exp_set.insert(_t->exp);
        _t++;
    }

    _t = polynomial_2.begin();
    for (int i=0;i<polynomial_2.size();i++) {
        exp_set.insert(_t->exp);
        _t++;
    }

    set_t = exp_set.begin();
    for (int i=0;i<exp_set.size();i++) {
        struct monomial _init_mono;
        _init_mono.exp = *(set_t++);
        _init_mono.num = 0;
        if (SORT_ORDER) polynomial_sum.insert(polynomial_sum.end(),_init_mono);
        else polynomial_sum.insert(polynomial_sum.begin(),_init_mono);
    }

    add_poly_to_sum(polynomial_1,polynomial_sum);
    add_poly_to_sum(polynomial_2,polynomial_sum);
    delete_zero_of_poly(polynomial_sum);
    output_poly(polynomial_sum);
    polynomial_sum.clear();

    return 0;
}
© 2012 Andy's Blog Suffusion theme by Sayontan Sinha