Js大数运算….

August 29th, 2010 No comments

Js不支持大于比较大的数字的运算的,所以必须模拟运算来支持。这里有三段代码,分别做了:大整数相乘,大整数相加,把一个大整数转化成二进制。
大整数相乘:

	/*大整数相乘*/
	function bigNumMulti(a,b){
       var p = a.match(/\d{1,4}/g).reverse();
       var q = b.match(/\d{1,4}/g).reverse();
       var f1 = 0;
       var result = "0";

       for(var i = 0; i < p.length; i++){
           var f2 = 0;
           for(var j = 0; j < q.length; j++){
               var t = (p[i]|0)*(q[j]|0);
               t += new Array(f1+f2+1).join("0");
               result = bigNumAdd(result, t);
               f2 += q[j].length;
           }
           f1 += p[i].length;
       }
       return result;
    }

大整数相加:


    /*大整数相加*/
	function bigNumAdd(a,b){
	    var m = a.split('').reverse();
	    var n = b.split('').reverse();
	    var ret = [];
	    var s = 0;

	    for(var i = 0; i < a.length || i < b.length; i++){
	        var t = (m[i]|0) + (n[i]|0) + s;

	        ret.push(t%10);
	        s = (t/10)|0;
	    }
	    if(s){
			ret.push(s);
	    }
		return ret.reverse().join('');
	}

大整数转化成二进制:


	/*把一个大整数转换成二进制*/
	function bigNumToBitMap(value)
	{
		var ret = [];
		value = value.toString().trim();
		while(1) {
			var num = value.charAt(value.length - 1);
			num = (num|0);
			/*判断改数是奇数还是偶数*/
			if(num % 2 == 0) {
				ret.push(0);
			}
			else {
				ret.push(1);
			}
			var newValue = new String("");
			var flag = 0;
			/*计算大整数除以2之后得到的值*/
			for(var i = 0; i < value.length; i++) {
				var tmp = (value[i]|0) + (flag == 0 ? 0 : 10);
				/*如果是偶数*/
				if(tmp % 2 == 0) {
					var a = tmp / 2;
					/*去除前导零*/
					if(a == 0 && newValue.length == 0) {
						continue;
					}
					newValue += a;
					flag = 0;
				}
				else if(tmp % 2 == 1) {
					tmp = tmp - 1;
					/*类似进位*/
					flag = 1;
					var a = tmp / 2;
					/*去除前导零*/
					if(a == 0 && newValue.length == 0) {
						continue;
					}
					newValue += a;
				}
			}
			if(newValue.length == 0) {
				break;
			}
			value = newValue.toString().trim();
		}
		return ret;
	}

在这里记录这三段Js代码。

Categories: Script Tags:

看着前方….

August 22nd, 2010 No comments

看着前方,需要做的事情很多,但是需要一件一件的去做,而不是什么都一下子都想做好,因为那样会什么都做不好的,不管这前方有多么迷茫,多么飘忽不定,我都应该看着前方,因为那里有我的下一步。你知道吗?我已经不是小孩了,我知道如何去承担,如何去面对?以后遇到什么事情应该好好考虑,不应该慌张,因为慌张没有用,如果我能做到淡定,那么就做吧,那样会给他人一种安全感,一种魄力。还有好好学习,工作尽力好好生活….
祝福我的朋友们~~~~

Categories: Life Tags:

现在….

August 7th, 2010 No comments

生活,好像是这么的遥远….没有时间,没有精力,没有空间….导致自己在这个blog上面留下的东西越来越少….人需要什么,安逸的生活,沟通,了解….这些足矣….很少会在这里发牢骚,就算有那也有几句话而已….需要面对的还有很多,我现在还不很明白而已,将来会出现什么让自己很困难,很难熬,很低落的事情,但是我需要做好现在,努力做好自己的负责的工作….我有敬仰的人,他们都默默的在奋斗,他们出现在我的身边,用行动在暗示着我要努力,要超越自己,这样自己会看淡这曾经的苦恼和烦恼….虽然生活不是这么容易也没有那么多的色彩,但是偶尔的开心和快乐都要小心的抓住,否则你不知道下一次快乐会在什么时候到来….努力工作吧….尽力把自己应该做的事情做到极致….

Categories: Work Tags:

数据库误区…..

July 11th, 2010 No comments

今天碰到一个问题,就是想把原本一个ranklist的功能重构一下,因为之前别人写的那个出现了时间和空间的效率问题。今天我想通过数据库的储存过程来优化这部分,基本思想是建立两个临时表,然后把新的数据和老的数据经过处理后导入这个临时表中,但是发现问题还是很严重,本以为只要查询几千条记录就ok了,但是发现查看了这些记录之后还需要根据这些记录来update临时表,这样有几千条记录,那么就需要几千条update语句了,起始问题还不没有这么简单,如果我继续深入sql操作,那么会发现还有一个问题,就是在操作获取数据的同时还需要一些逻辑计算,而这样的sql很难同时写出来,比如我需要user的solved我可以通过SELECT COUNT(*) FROM contest_status WHERE contestid = xxx GROUP BY userid.这样可以把每人一个用户的解决的问题算出来,但是我还需要timeusage这个字段的值,这个需要一些判断操作,比如如果一个人ac了两次,那么第二次ac的值不应该算做罚时,是的,那如何判断罚时呢?sql中的没有数组,没法操作复杂的逻辑,我陷入了死胡同了,如果要做,那么我只能通过再次sql查询看该用户是否已经ac过题目了,这样我初步算了一下一个ranklist的操作差不多要几万次sql操作,虽然存储过程会有数据库持久连接,而不需要消耗sql操作时的打开和关闭,但是这么多的sql操作想必没有一个人能够有信心写下去,所以写到一半,我停下来了。
问了一下gl,他说他想用php来做,这个我一直不报有很大的信心,因为我一直认为sql的速度比php脚本要快点多,但是我却忘了一点php的逻辑,功能能力比sql要强上好几百倍,到了晚上,再去问他的时候,他说ok了,心里觉得这么快,所以要了代码看了一下,只用了4个基本的sql就好了,我一下子明白了,sql只是用来存放数据的地方,只可以做一些基本的查询操作,起始就连多表关联有时也会使用脚本来处理的,而只是用sql分别取出每一个单表的数据而已,所以道理很简单了,不要期望sql帮你做完全部数据处理的事情……

Categories: Database Tags:

工作与生活….

July 11th, 2010 No comments

刚刚好有一个月没有更新了,自己也没有多少心思去写点什么,但是自己还是写了几个程序的,有时间把它们放到blog上来。最近几天开始工作了,工作一开始给了我新奇,随后是一种失落,觉得自己的坏毛病还是出现(急于求成,犯一些小错误而导致bug),但是现在也慢慢适应,工作的内容跟我在学校的工作差不多,只是一些语言和框架不同而已,还有就是需求和业务我也不熟悉,但是毕竟现在还只是一个开始,数据库方面的设计跟实际的东西也联系不起来,但是之后熟悉了之后应该会好起来的吧,现在工作还算可以,自己也在开始帮忙做维护的工作了。
至于学校的生活虽然说还不至于终结,但是现在还真的差不多结束了,大学的课程差不多都修完了,大四也只有一个大学语文和一个毕设,其他的课程都差不多了,这就样学生时代就要结束了,想起以前刚进大学时候的那种稚嫩,真是太怀念了,那时候还是很天真的,也没有考虑很多事情觉得应该在大学里面干的好一点,你看现在这么快就走过了3年,你说心里应该是一种什么滋味,就像打翻五味瓶一样的感觉吧!很怀念大学时代,虽然还有一年的时间,但是我的心里已经老了,已经变得那么的现实,而并没有那种大学生的感觉了。再见了,我的大学….
以前很想独立的生活,但是却想的很天真,觉得没有那么恐怖,但是现在走上实习的岗位,断绝父母的经济来源,什么事情都要自己出钱之后,才发现生活是如此的现实,手指搬搬可以把钱算的很清楚,什么好好生活,工作和生活平衡啊,都TMD扯淡,现实是这样的,如果要生存那么自己就得去适应,我想我会因此而长大的…….
PS:希望某人能够好好考研,并且考上自己理想的学校!

Categories: Life, Work Tags:

This is a life…..

June 11th, 2010 2 comments

今天晚上我们聚餐了,我喝了差不多20杯左右吧,实在是撑了很久啊,但是看到大家快乐的气氛,自己感到也无所谓了,真的起码我们很开心。
我喜欢这样的生活,喜欢交很多朋友,那样才能让我不至于寂寞和孤独,如果你看过《friends》那么你会有那么一种感觉的,是的我like them, 喜欢他们给我的启发,让我更加懂得珍惜身边的朋友,如果是朋友,我一定会付出真心来对待,我不是一个虚伪的人,我也不喜欢虚伪,我很坦率,我喜欢无话不谈,喜欢聚餐,喜欢在寂寞的时候联系朋友,because this is a life……我又是很伤感,会比较感性,但是我往往会想起我的朋友,因为有他们我觉得也就不会太难受了,this is a life , i like you,hope we will get together someday again….

Categories: Life Tags:

Mysql修改root密码….

June 1st, 2010 No comments

有时候,可能你需要修改mysql数据库的密码,那么你可以使用下面几种方法,不管你是否知道密码还是不知道,都有办法。
Mysql:
修改用户密码的方法:
1:如果知道密码
mysql -b -uroot -p;
use mysql;
UPDATE user SET Password=PASSWORD(’newpasswd’) WHERE user=’user;
FLUSH PRIVILEGES;
2: 如果不知道密码
mysql_safe –skip-grant-table & mysql -u root -p -b;
use mysql;
UPDATE user SET Password=PASSWORD(’newpasswd’) WHERE user=’user;
FLUSH PRIVILEGES;
3: 如果知道密码2
mysqladmin -uroot -p oldpasswd newpasswd

PS:今天是六一儿童节,祝我的小表妹儿童节快乐!

Categories: Database Tags:

简单编译器前端 — Java Version

May 28th, 2010 No comments

这周一直在写这个破编译器,同时也学习了一点java知识,以及类的知识。我就只是把这个破编译器挂出来,但是代码写的不是很好看。
语法规则:

P → C V S | C S | V S | S
				/* P-程序 C-常量说明 V-变量说明 S-语句
	C → Const D ;
				/* D-常量定义
	D → id = num , D | id = num
	V → Var ID ;
	ID → id , ID | id
	S → A | I | W | B |ε
				/* A-赋值语句 I-条件语句 W-当循环语句 B-复合语句
	A → id = E
				/* E-表达式
	E → T | E P T
				/* T-项 P-加法运算符
	T → F | T M F
				/* F-因子 M-乘法运算符
	F → id | num |(E)
	P → + | -
	M → * | /
	I → if X then S | if X then S else S
				/* X-条件
	X → E O E
				/* O-关系运算符
	O → == | <= | < | > | >= | <>
	W → While X do S
	B → begin Y end
	Y → S ; Y | S

compiler
代码下载:Simple Compiler

Categories: Code Tags:

主线程退出子线程是否会被KILL掉 && 不是代码的问题…

May 20th, 2010 No comments

好像有半个月没有写了,自己也不知道这半个月来做了什么,可能是没有什么东西可以写的,呵呵,只是个借口….
首先看看这个问题,也就是不是代码的问题,为什么我要提到这个问题,起因在于两天前在用php导出ranklist数据的xls的时候(phpExcel库),发现在本地的时候,运行正常,但是把代码update到服务器上的时候却发现,导出相同比赛的数据的时候,服务器上会中途退出(也就是php函数执行到一半退出),起初以为代码哪里出了问题,但是突然间我想到是不是apache的配置问题,这个念头我不知道为什么会出现,后来我查看了本地服务器中php.ini和服务器的配置文件差别,发现在max memroy limit这个参量中差别很多,本地被配置成100M,而服务器上只有16M,然后在本地导出xls脚本中使用了(memory_get_peak_usage(true) / 1024 / 1024)这段来查看脚本运行时最大需要的memory要多少,哈哈,真的是大于16M,所以在服务器上面把内存限制改为了100M,问题就解决了。

总结:有时候,出现问题的时候,应该对方向考虑问题,并不一定问题出现在你的代码上,用可能是系统问题,平台问题,配置问题等等。

有一个问题想问大家,你觉得主线程退出的时候子线程会被kill掉吗?(win)
这个是whereisherecomefrom朋友问我的一个问题,一开始我从自己的感觉和写过的多线程(其实,这方面我代码写的真的很少),回答他说主线程退出那么子线程会被kill掉。但是,我自己想来想去觉得很不确定,而为什么我会这样会回答呢?原因是我们oj内核的多线程,都是父线程在创建子线程之后是不退出的,而该线程是主线程是main线程。后来去网上去看了一下网友对该问题的讨论,发现我的理解是错的。这个问题的大致答案是:main,winmain等等一些是比较特殊的主线程,当启动进程的时候,一开始就进入这个为主函数的主线程,而一旦该主线程正常退出的时候,会返回给运行期代码,以让它能正确清楚进程使用的所有运行期资源。当c运行期资源被释放掉之后,c运行请启动代码就会显式调用exitprocess,并将进入点函数返回的值传递给它。这就是为什么当主线程退出的时候,整个进程就退出的原因。但是好像如果主线程异常退出,那么进程可能不被终止,这个是我从网上的讨论中了解的。
那么接下来,需要了解的是如果不是主线程,只是普通线程在创建子线程后退出,那么他所创建的子线程会不会被kill掉。回答是不会退出,而且自己也写了代码测试了一下,的确不会。原因分析(自己的观点):有人说线程之间是没有父子关系的,但是线程之间,应该会共享地址空间的,有人说线程释放,那么它所占用的那段地址空间也会被释放,那么它所创建的子线程也就会被kill掉,但是我想这样不合理,因为这样的话资源的利用是很低的,本生共享地址空间中的代码或则数据都应该是同步保护的,而因为父线程退出而kill掉所有的子线程这显然很浪费,虽然我一直在说浪费,却无法给出一个比较好的解释,但是我还是觉得这很不合理,我觉得应该这样这些资源有一个共享计数,共享这个地址空间的线程增加时候,那么这个计数值会增加,而线程退出的时候,计数值会减少,如果计数值没有减为0,那么说明还有线程在使用它,那么它就不能被销毁,清空。所以子线程就不会被kill掉,这样子线程不会因为父线程的推出而需要终止,这样资源利用率显然要高很多,而在操作系统中共享计数这种方式也是很常见的,而且实现也很简单。这样同时说明了,线程之间没有父子关系,只有主次关系。
我大致是这么理解的。

Categories: Process/Thread Tags:

《苦难的历程》-列夫.托尔斯泰….

May 3rd, 2010 No comments

今天早晨,终于把这部小说看完了,我没有中途放弃看它,也没有想过这个念头,这部小说长达1000多页,总共花了我六个月的时间,大部分时间没有去看。讲述俄罗斯革命发生的一些事情,讲述了一对姐妹的人生和爱情,讲述了战争的残酷和无情,美丽的爱情是经历了苦难的磨练之后,还能在一起,人在不断的坎坷和困境中变得成熟刚毅,太多的回忆了,而回忆是一个人在这个世界上美好的东西,没有它人活着就没有意义,生活需要劳动,一种充满热情的劳动,为了同一种美好明天而劳动,但是现在的社会早已忘了过去苦难的日子带来的反省了,是的,我们忘了,现在每一个人活了就只是为了”更好的生活“,人们在忽视很多其他东西,变得自私自利,变得高高挂起,变得麻木不忍…..好想回到过去,20世纪就离我们这么遥远了吗?科技带给我们的难道是人性的冷漠吗?还是我真的太愚昧了,太天真了,太傻了….难道过去的老一辈都只是傻瓜吗,会想到如此”美好”生活是这样的吗?难道物质的进步就足够了吗?不是的,我很想痛骂一顿,包括我自己在内!

Categories: Books, Personal Tags: