Project Euler框架.

    技术2024-11-18  10

    http://projecteuler.net

     

    一个朋友推荐给我的,最近拿来打发时间(同时再次感到我那杯具的鸟语和

    数学是多么的不够用).做这种小东西我惯用js+windows script.但每次

    在cmd下敲cscript balabala....之类的是在烦不胜烦.加之纯js要代码重

    用只有copy & paste.弄个hta/html之类的又太麻烦.所以就做了这么个

    小玩意.

     

    euler.wsf:

    <job> <mce:script language=JScript src="common.js" mce_src="common.js"></mce:script> <mce:script language=JScript><!-- function print(m) { WScript.stdOut.write(m); } function println(m) { WScript.Echo (m); } var openFile; (function () { var fso = new ActiveXObject("Scripting.Filesystemobject"); openFile = function (path){return fso.opentextfile(path);} var file = fso.opentextfile(WScript.Arguments.unnamed.item(0)); var script = file.readall(); file.close(); eval (script); })(); // --></mce:script> </job> 

    逻辑很简单,读取一个js文本,然后eval,提供了两条输出函数print和println.

    这样一旦脚本性能不足,可以很轻松的移到js.net.而不用处理那该死的WScript.

     

    注意有个common.js,这里相当于include.常用的函数比如遍历字符串之类的

    可以写在这里.

     

    common.js

    //求最小质数因子.如果找不到则返回1. //命名不准确啥的都是浮云= = function getminfactor (n){ for (var i = 2,r = n/i; i<= r;r = n/++i) if (n % i == 0) return i; return 1; } //遍历字串. String.prototype.foreach = function (func) { for (var i=0;i<this.length;++i) if (func(this.charAt(i),i)==false) break; } function isprime (n){return getminfactor(n)==1;} function pow2(n){ return n*n; } function lcm (a,b) { var g = a>b?a:b; var l = a>b?b:a; for (var i = 1;i <= l;++i) { var ret = g * i; if (ret % l == 0) return ret; } } //search all str in data,and call the callback function function findall (data,str,func){ for (var start = data.indexOf(str,0); start != -1; start = data.indexOf(str,++start)) { func (start); } } //quicksort 懒得写直接vc.. var quickSort = function(array) { var arr = array; var i = 0; var j = arr.length-1; var qSort = function(i, j){ if( i == j ){ return }// 当前组仅有一个元素则结束 var ai = arr[i];//取出的主元 var ii = i;//记录i的开始位置 var jj = j;//记录J的开始位置 while( i < j ){ // j <------- if( arr[j] >= ai){ j--; }else{ arr[i] = arr[j]; i++; while( i < j){ if(arr[i] > ai){ arr[j] = arr[i]; break; }else{ i++; } } var k = arr[i]; } } if( ii == i){ qSort(++i, jj); return ; } arr[i] = ai; qSort(ii, i);//第一组排序 qSort(j, jj);//第二组排序 //--- } qSort(i,j); return array; } 

    最后用一个批处理负责执行:

    eu.cmd

    @cscript euler.wsf %* 

     

    然后写个简单的题目测试一下:

    Problem 1

     

     

    If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

    Find the sum of all the multiples of 3 or 5 below 1000.

     

     

    求小于1000且可被3或5整除的自然数之和

    001.js

     

    var sum = 0; for (var i = 3;i< 1000;++i) if (((i%3)==0 || (i%5)==0)) sum += i; print (sum); 

     

    输入eu 001.js后回车得到结果233168

     

    最新回复(0)