poj3984
顶嵌杯决赛第二题,简单的bfs,关键是gcc不能用stl,所以得自己写一个队列。
已注释:
#include <stdio.h>
#include <stdlib.h>
int mm[5][5];
int dir[4][2]={ {0,1},{0,-1},{1,0},{-1,0}};
typedef struct
{
int x,y;//坐标
int pre;//前一节点
}node ;
node que[10005];
int vs[5][5];//标记已访问
int judge(node a)
{
if(a.x<0||a.y<0||a.x>=5||a.y>=5)return 0; //越界返回0
if(mm[a.x][a.y]==1)return 0;//墙
return 1;
}
void dfs(node a)//这个其实是输出输出函数
{
if(a.pre==-1)return ;//结束条件(找到原点)
else dfs(que[a.pre]);
printf("(%d, %d)\n",a.x,a.y);//从第二个节点开始顺序输出,注意中间有个空格
}
int work()//广搜函数
{
int i;
node t1,t2;
memset(vs,0,sizeof(vs));//这个其实无所谓的吧
int sp,head;//sp队尾标志,head队首标志
//初始化左上角
que[0].x=0;
que[0].y=0;
que[0].pre=-1;
vs[0][0]=1;
head=0;
sp=1;
while(head<sp)
{
t1=que[head];//队首出队
head++;//对手标记加1
if(t1.x==4&&t1.y==4)break;//已找到,退出
t2=t1;
for(i=0;i<4;i++)//遍历四个方向
{
t2.x+=dir[i][0];
t2.y+=dir[i][1];
if(judge(t2) && vs[t2.x][t2.y]==0)//vs是已访问
{
t2.pre=head-1;//标记前节点(在que里的序号)
que[sp++]=t2;//进队
vs[t2.x][t2.y]=1;//标记已访问
}
}
}
dfs(t1);
return 0;
}
int main ()
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)scanf("%d",&mm[i][j]);
}
printf("(0, 0)\n");
work();
return 0;
}
CUGB第四届程序设计大赛解题报告
CUGB第四届程序设计大赛解题报告
比赛链接:
http://acm.cugb.edu.cn/JudgeOnline/showcontest?contest_id=1038
A题 医院的灯
水题,只有4盏灯,1到4查找灯的状态,遇到1(明)就输出再break;如果查
找到4还是0(暗)的状态,就输出-1
我没考虑-1WA了一次,然后没改Main CE了一次,一不小心一个小时就没了,
郁闷!
代码:
import java.io.*;
import java.util.*;
public class a {
public static void main(String args[]) {
int a,b,c,d;
Scanner cin = new Scanner(new BufferedInputStream
(System.in));
while(cin.hasNext()) {
a=cin.nextInt();
b=cin.nextInt();
c=cin.nextInt();
d=cin.nextInt();
if(a==1) {
System.out.println("L1");
continue;
}
if(b==1) {
System.out.println("L2");
continue;
}
if(c==1) {
System.out.println("L3");
continue;
}
if(d==1) {
System.out.println("L4");
continue;
}
System.out.println ("-1");
}
}
}
B题: 僵尸农场大致是给你N*N块土地的状态,然后统计金币总额,注意:这里
只有植物(或者僵尸)为"ripe"的状态下,才把金币加上去,同时先假设心情
为高兴(flag=0),如果遇见状态为"withered", 则f=1;
import java.io.*;
import java.util.*;
import java.math.*;
public class b {
public static void main(String args[]) {
int a,b,c,d,flag,money,i;
String s;
BigInteger x;
Scanner cin = new Scanner(new BufferedInputStream
(System.in));
while(cin.hasNext()) {
a=cin.nextInt();
money=0;
flag=0;
for(i=0; i<a*a; i++) {
s=cin.next();
if(s.equals("None")) {
} else if(s.equals("Plant") ||
s.equals("Zombie")) {
s=cin.next();
if(s.equals("growing")) {
b=cin.nextInt();
} else if(s.equals("ripe"))
{
b=cin.nextInt();
money+=b;
} else if(s.equals
("withered")) {
b=cin.nextInt();
flag=1;
}
}
}
if(flag==0)
System.out.println("DSHAN is happy
and she has just earned "+money+" Gold.");
else
System.out.println("DSHAN is
depressed and she has just earned "+money+" Gold.");
}
}
}
C题:wildfire很水,用set stl,自带排序去重功能,再用set迭代器输出
因为我不会java的stl,所以用c++写
#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
int main(){
unsigned int t,tt;
int a;
while(scanf("%d",&t)!=EOF)
{
set<int> s;
for(tt=0;tt<t;tt++)
//while(t--)
{
scanf("%d",&a);
s.insert(a);
}
printf("%d\n",s.size());
set<int>::iterator it;//定义前向迭代容器
it=s.begin();
cout<<*it;
for(it=++s.begin();it!=s.end();it++)
{
cout<<" "<<*it;
}
cout<<endl;
}
return 0;
}
D题:(哈尔滨现场赛的题目)贪心算法,排序,正逆相加即可
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010],b[1010];
int main(){
int t,tt,n,x;
int s,ans;
while(scanf("%d%d",&n,&x)!=EOF)
{
for(tt=0;tt<n;tt++)
{
scanf("%d",&a[tt]);
}
for(tt=0;tt<n;tt++)
{
scanf("%d",&b[tt]);
}
sort(a,a+n);
sort(b,b+n);
ans=0;
for(tt=0;tt<n;tt++)
{
s=a[tt]+b[n-tt-1]-x;
if(s>0)
ans+=s;
}
printf("%d\n",ans);
}
return 0;
}
E题:状态传递,再加上点floyd算法求解,(floyd在求最短路上的优势在于,
可以一次性求解多个最短路,不好的是耗时),先初始化d[i][j]=0; 若a比b
强,则d[a][b]=1; d[b][a]=2(表示b比a弱);代码:
import java.io.*;
import java.util.*;
import java.math.*;
public class f {
public static void main(String args[]) {
BigInteger[] h=new BigInteger[65];
h[0]=BigInteger.ONE;
h[1]=BigInteger.ONE;
for(int i=2;i<61;i++)
h[i]=BigInteger.ZERO;
for(int i=2;i<=60;i++)
for(int j=0;j<i;j++)
h[i]=h[i].add
(h[j].multiply(h[i-j-1]));
int a,b,c,d;
BigInteger x;
Scanner cin = new Scanner(new BufferedInputStream
(System.in));
while(cin.hasNext()) {
a=cin.nextInt();
if(a==0) {
break;
}
System.out.println (h[a/2]);
}
}
}
F题:地大恐龙博物馆买票问题:裸的Catalan数
我的算法不怎么样,递归式:
h(n)=((4*n-2)/(n+1))*h(n-1);比较好
代码:
import java.io.*;
import java.util.*;
import java.math.*;
public class f {
public static void main(String args[]) {
BigInteger[] h=new BigInteger[65];
h[0]=BigInteger.ONE;
h[1]=BigInteger.ONE;
for(int i=2;i<61;i++)
h[i]=BigInteger.ZERO;
for(int i=2;i<=60;i++)
for(int j=0;j<i;j++)
h[i]=h[i].add
(h[j].multiply(h[i-j-1]));
int a,b,c,d;
BigInteger x;
Scanner cin = new Scanner(new BufferedInputStream
(System.in));
while(cin.hasNext()) {
a=cin.nextInt();
if(a==0) {
break;
}
System.out.println (h[a/2]);
}
}
}
G题:包子的密码;求亲和数,又是数论题,题目四秒,我的暴力30秒左右,没
心思优化,直接打表:
另外这题输出让我费了不少功夫,sprintf用的不熟,呵呵,不过早知道打表
就无所谓了
代码:
#include<cstdio>
//#include<cmath>
#include<iostream>
#include<string>
using namespace std;
int a[27][2]={ {220,284},{1184,1210},{2620,2924},{5020,5564},
{6232,6368},{10744,10856},{12285,14595},{17296,18416},
{63020,76084},{66928,66992},{67095,71145},{69615,87633},
{79750,88730},{100485,124155},{122265,139815},{122368,123152},
{141664,153176},{142310,168730},{171856,176336},{176272,180848},
{185368,203432},{196724,202444}};
int main()
{
int a1,a2,b,i,j,cas=0;
char ii[20];
string iii,str;
scanf("%d%d",&a1,&a2);
if(a1>a2)
{
b=a1;
a1=a2;
a2=b;
}
for(i=0; i<=22; i++)
{
if(a[i][0]>a1 && a[i][1]<a2)
{
cas++;
sprintf(ii,"%d %d\n",a[i][0],a[i][1]);
iii=ii;
str+=iii;
}
}
printf("%d\n",cas);
cout<<str;
//system("pause");
return 0;
}
后面的题目都没看(没时间,估计也做不出来)
下文转自http://user.qzone.qq.com/277930484/
H题: 锄大地(其实跟打牌毫无关系)无非是找数字规律,推公式了,这是题
目的数据:1张牌:不计分 2-7张牌:n分 8-9张牌:2n+7分 10-12张牌:3n
+2*9+7 13-16张牌:4n+3*12+2*9+7 17-21张牌:5n+4*16+3*12+2*9+7 可以发
现区间段的数字个数为 2,3,4,5,6....(从数字8开始);可以发现得分的常数
项为7,2*9+7,3*12+2*9+7,....(从数字8开始):每一个常数项和上一个数段
的最后一个得分结果相同!!!;可以发现系数为:2,3,4,5,6.....;接下来
,就是你的代码实现问题了代码:#include<stdio.h>
int Case;
__int64 d[1501];
void p()
{
int i,j,s,k,t;
d[0]=d[1]=0;
t=2; s=7; k=7;
for(i=2;i<=7;i++)
d[i]=i;
for(i=8;i<=1500;i++)
{
d[i]=i*t+s;
if(i==k+t)
{
k+=t;
s=d[i];
t++;
}
}
}
int main()
{
int j,a,b,c,A=0,B=0,C=0;
p();
scanf("%d",&Case);
for(int i=1;i<=Case;i++)
{
scanf("%d%d%d",&a,&b,&c);
printf("Case %d:\n",i);
printf("Leefour:%I64d\n",d[a]);
printf("Eli_love:%I64d\n",d[b]);
printf("Pmonkey:%I64d\n",d[c]);
A+=d[a]; B+=d[b]; C+=d[c];
}
__int64 min=-1;
j=0;
if(A>min){min=A; j=1;}
if(B>min){min=B; j=2;}
if(C>min){min=C; j=3;}
if(j==1) printf("Leefour ");
else if(j==2) printf("Eli_love ");
else if(j==3) printf("Pmonkey ");
printf("lose!\n");
return 0;
}
总结:
java不是很熟练,所以写水题的速度不行
java的类库用了解的太少
java细节小错误导致浪费时间调试的事情屡有发生
?
java效率实在不行,正式比赛还是cpp比较靠谱,如图
【转】疯狂提交找错法
做 ACM 的那些人应该也都知道传说中的“疯狂提交找错法”吧。就是如果你题目没有过的话,提交的罚时是不会在最后的分数里面扣掉的。当然是希望在尽量少的次数内过掉,但是情急之下,疯狂提交也是一个办法,不管怎么算它都是有好处的:
- 如果最后题目 AC (Accept) 了,虽然罚时会让排名下降,但是不管罚时多少,多做出一道题的总比少做出一道题目的排名要靠前。
- 如果题目没有 AC ,也并没有什么损失。
但是疯狂提交也必须要能“找错”,否则就没有什么意义了。今天我也非常疯狂地爽了一把,并且最后成功找到问题,把题目 AC 了。
其实我平时并不做 ACM ,因为我对存算法不太在行,而且我也特别讨厌 ACM 这种纯黑箱的形式,只告诉你正确或者错误,而得不到一点调试信息。但是仔细想想其实现实世界很多地方是这样的,比如许多商业软件,没有提供源代码,出错以后你也只能是茫然,再比如自己发布软件的时候,甚至连“对”或者“错”这样的单纯的结果都没有,你只能尽可能地去遇见和避免各种 Bug 和错误。所以其实做 ACM 的题目应当还是一个相当不错的锻炼吧。
但是数值分析这门课的几个作业是 ACM 形式的判题系统,所以还得去做。这次的题目并不难,就是代数方程求根,算法也在书上都讲过了。然而做出来的程序无论如何都是 Wrong Answer 。这四五天的空余时间几乎都在做这个题目,唉,做得郁闷到极点,怎么就能不对呢?我尝试了各种各样的方法,牛顿法、改进的牛顿法、二分法、Steffensen 方法,还把它们结合起来,修改各种优化参数……总之就是过不了。
最后我静下来仔细想了一下,如果测试数据里面的数据非常大的话,用 double 进行计算必定会溢出,那样肯定算不出结果来,但是我看到题目的状态显示有人确实通过了,所以测试数据应该不会特别大。不过令我郁闷的是我在使用二分法的时候竟然 TLE (Time Limit Exceeded) 了,那除非是一个很大的区间啊!
最后我决定用疯狂提交找错法了。我要探测测试数据!但是 OJ (Online Judger) 给出的结果种类非常少,包括 WA (Wrong Answer) 、TLE 和 Runtime Error SIGSEGV 等,根本不能从中得出测试数据,然而我们可以对测试数据(包括整个运行环境中的任何状态)进行一个 bool 测试并得到结果:结果就由 WA 和 SIGSEGV 两种状态来区分。于是我写了一个 helper 函数:
void fire_seg_fault(){ int *ip = 0; *ip = 0;}原理很简单,就是要产生一个运行时错误, abort 函数不允许调用,除以零似乎也被忽略掉了,不过对 NULL 指针解引用是绝对会造成运行时错误的。然后在代码里面就可以对测试数据进行探测了,比如:
if (n > 1000) fire_seg_fault();提交,然后根据结果是 WA (或者 TLE) 还是 SIGSEGV 来判断 n 的范围。然后逐次缩小范围,对于整数来说总是可以在比较可观的次数之内得到一个准确的值。对于浮点数来说,其实计算机里面的浮点数也不会是无限位的,所以从理论上来说也可以通过逐步缩小范围得到“精确”的值(也就是它给定的值)。
经过我疯狂探测,得出了测试数据的规模:
- 一共有 14 组测试数据。
- 有 a > b 的情况。(真过分,ACM 就经常有这种情况啊,说“a and b are the two end-points of the given interval”,故意不说 a 比 b 小,然后又在示例测试中把所有的例子都写成 a 比 b 小,让你产生错觉,却又在测试数据里面来个 a 比 b 大,如果不小心误以为 a 一定比 b 小的就要郁闷了)
- a 的取值范围为 -100 到 1 。
- b 的取值范围为 -0.5? 到 3 。
- eps 如题目中描述的一样,一直都是 0.00005 。
出乎我的意料竟然测试数据的规模这么小的。可是竟然在二分法的时候会 TLE ,这就让我不解了。接着我继续用探针探测出 TLE 出在第三组测试数据上。第三组数据 n 是 5 ,并不大,所以我决定把第三组的参数全部探测出来,当然并不是特别轻松的活,我都想用脚本来写个“探测机”了。不过总算数据并不变态,最后还是被我探测出来了:
a == -4b == 2n == 5c[5] == 1c[4] == 4.6c[3] == -1.94c[2] == 0.296c[1] == -0.0199c[0] == 0.0005这下为什么会 TLE 就明了了,画出函数图形如下所示:
我在判断结束条件的时候用了如下语句:
其中 GOOD_ENOUGH
是一个用于判断绝对值的宏。总之就是函数值 fp
在给定的区间 (-4,2)
里面的函数值永远都达不到给定的精度 (eps)
,所以就在那里死循环了。去掉那个判断得出的结果会飞掉,因为我在这里犯了一个很严重的错误:左右两边函数值的符号是一样的,不能用二分法。
但是我是在牛顿法失败的情况下才会去用二分法。牛顿法为什么会失败呢?实际上,在给定的区间之内根本没有实根,只有 4 个虚根,唯一的实根是 -5 左右的那个,但是那个是在区间之外的,可是几乎所有的收敛序列都直接收敛到那里去了,但是是在给定的区间之外的,无疑要被丢弃。
可是这样的话题目不是有问题吗?题目中说过:
It is guaranteed that a unique real number r exists in the given interval such that p(r) = 0.
在给定的区间之内明明没有根嘛,不过单从图形上来看的话,还是很接近零的。最后我将牛顿法的初始值选取密度加大了,总算得到一个看上去像样点的解,算出来的函数值是 0.0045 ,唉,这和零相比应该还有很大的差距吧,可是我把程序提交上去之后竟然 AC 了!不过让我觉得好像是有些碰运气的感觉啊。
不过毕竟是郁闷了几天的题目了,总算是通过了。发现自己在做这样的题目的时候经常都是考虑得太过复杂了。但是如果数学功底再扎实一些,从理论上来仔细分析一下的话,也许不会出现这种类似于“侥幸”通过的尴尬情况了吧。
Java开发工具大比拼
* NetBeans
NetBeans 是由Sun建立的開放原始碼的軟體開發工具,是一个开放框架,可扩展的开发平台,可以用于Java,C語言/C++等的开发,本身是一个开发平台,可以通过扩展插件来扩展功能,現在最新的穩定版本是Netbeans 6.1。在 NetBeans Platform 平台中,應用軟體是用一系列的軟體模組(modular software components)建構出來。而這些模組是一個jar檔(Java archive file)它包含了一組Java程式的類別而它們實作全依據依 NetBeans 定義了的...
* Eclipse
Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。 Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。 Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开...
* J2EE
这是SUN公司推出的J2EE SDK,是J2EE的参考实现,是实现J2EE最全的开发工具包,不过最好只在开发中使用。 J2EE JavaDoc: http://www.oschina.net/uploads/doc/j2ee_5.0.03/index.html J2EE,Java2平台企业版(Java 2 Platform Enterprise Edition), 是Sun公司为企业级应用推出的标准平台(Platform)。Java平台共分为三个主要版本Java EE、Java SE和Java ME。 Sun公司在1998年发表JDK1.2版本的时候, 使用了新名称Java 2 Plat...
* IntelliJ IDEA
屡获殊荣的Java开发环境,不过在现在Eclipse横行的世道,只剩下一些铁杆粉丝还在坚持使用此开发环境。
* JavaCC
JavaCC(Java Compiler Compiler) 是一个用JAVA开发的最受欢迎的语法分析生成器。这个分析生成器工具可以读取上下文无关且有着特殊意义的语法并把它转换成可以识别且匹配该语法的 JAVA程序。它还提供JJTree等工具来帮助我们建立语法树。JavaCC plug-in:一个用于辅助JavaCC应用程序开发的Eclipse插件.
* Groovy
Groovy是一种基于JVM的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性。 Groovy已在WebWork2中的应用。它可以被编译为标准的Java Bytecode。
* EasyEclipse
EasyEclipse这是一个把EclipseIDE与一些关键的开源插件分类打包在一起.以使得Eclipse更易于下载,安装,使用.
* SUN JDK
SUN 公司的Java开发工具包,原汁原味的。 JDK 6.0 文档:http://www.oschina.net/uploads/doc/j2se/index.html JDK 6.0 JavaDoc:http://www.oschina.net/uploads/doc/j2se/api/index.html Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的 HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动...
* ProGuard
是一个免费的 Java类文件的压缩,优化,混肴器。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、字段和方法 。eclipse已经把Proguard集成在一起了。
* jEdit
jedit 是一个用java 编写的源码开放的文本编辑器。有很多有用的特性,包括语法加亮显示,括号匹配,表达式搜索,多个文件搜索和替换,定义键盘宏等等。jedit 的插件结构非常完善。在日本相当受欢迎!
* ANTLR
ANTLR(ANother Tool for Language Recognition)它是Java开发的词法分析工具,它可以接受词文法语言描述,并能产生识别这些语言的语句的程序。作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。ANTLR知道怎样去生成识别程序,语言包括 Java,C++,C#. Hibernate就是采用ANTLR来编译HQL查询语言的。...
* JBuilder
JBuilder 2008 ,The Open, Fully Supported Java IDE,是一种Borland软件公司出品的Java集成编程环境,有不同功能程度的多个版本。甲骨文公司(Oracle)内部用的软件 JDeveloper是JBuilder补充改写的。 JBuilder的主要竞争者包括IBM的Websphere,JetBrains的IntelliJ IDEA,BEA Systems和Eclipse。 2005年5月,Borland 公司宣布下一个版本的 JBuilder 将会以 Eclipse 为基础。 ...
* Jython
Jython 是Python的纯Java实现。她无缝地结合了Java类与Python,使用户能以Python语言的语法编写在Java虚拟机上运行的软件。它的特点有:与相似的Java程序相比,Jython极大的的减少了编程代码量。Jython同时拥有解释器和编译器,使其无需编译就可以测试程序代码。 Jython 是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。 Jython也有很多从CPython中继承的模块库。最有...
* JFlex
JFlex是一个Java的词法/语法分析生成器。
* OpenJDK
an open-source implementation of the Java Platform, Standard Edition, and related projects.
* Cube-J
Cube- J是一个开源轻量级Java IDE。Cube-J的特性包括:语法高亮显示,代码自动缩进、自动加括弧、显示行号、加亮显示一行代码、提供编译功能、文件浏览、类结构大纲、控制台、浮动窗口框架(Docking Framework)、代码自动完成、多种外观/皮肤。Cube-J既可以以桌面应用程序方式运行也可以以Applet方式运行。
* Midinux SDK
11 月21日,在北京嘉里中心,中科红旗发布了Midinux SDK。此次发布的SDK,是为MID Linux 开发商、爱好者所提供的,为MID开发应用软件的工具集,它为MID软件产业再次注入了强大的力量。此前,已经有众多的ISV基于Midinux SDK开发了大量高价值的应用,为MID市场提供了至关重要的组成部分。 Midinux SDK整合了Midinux所有的应用环境,支持库和头文件,包括了GTK,Clutter,EFL等架构、示例程序。SDK支持 C/C++,Python,Java等开发语...
* Beanshell
Beanshell 是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(simple method closure)来支持,就如同在Perl和JavaScript中的一样。 它具有以下的一些特点:使用Java反射API以提供Java语句和表达式的实时解释执行;可以透明地访问任何Java对象和API;可以在命令行模式、控...
* RetroGuard
RetroGuard是不错的Java混淆器,在JBuilder7的企业版中也带了这个混淆器。而yGuard 是RetroGuard的一个升级版本自带一个ANT任务
* Jcoder
Premiumsoft 发布了Jcoder Java IDE 1.0的Windows版本是一个轻量级的Java IDE编辑器。为Java和Web的开发人员提供全面的设施,提高开发,编译和运行Java程序的效率。Jcoder的特点是直观的界面和构成源代码的编辑器,编译器,项目管理,调试器,代码编辑和代码完成的功能。
* JavaGuard
JavaGuard是一个通用的字节码模糊器,旨在容易地适合你的规则建造和测试进程,保证你的有价值的代码更安全,使其不易被反编译以及其它形式的反向处理。
* JODE
JODE 包含一个Java混淆器与一个Java优化器。通过一个脚本文件可以控制Class文件的多种优化方式。它支持以下操作:1.能够把 Class,method,field 和local names 重命成简略的,模糊的或者特定名字的或者依照一个转换表.2.除去debugging 信息.3.除去"坏死的"代码(classes, fields, methods).4.优化局部变量的分配
* CAP
CAP(Code Analysis Plugin)是一个非常便利的Eclipse插件,它可以解析Java包/类依存关系,同时给出图形报表。 CAP的特征与主要功能 Ecplise插件(3.0+)图形报表 Java包以及类之间的依存关系分析验证框架结构的健壮性提高Java代码代码的封装性,保证框架结构品质,包的构造结构,代码的可重用性,可维护性等等 在线安装URL:http://cap.xore.de/update ...
* BEA JRockit
BEA的Java开发工具,据说性能非常好!
* tIDE
tIDE 是一个非常小,快速,强大,易于使用的Java IDE。整个程序只有1M左右,无需安装。tIDE完全采用Java开发,需要JRE6或更高的运行环境,但可以用于开发JDK5,1.4甚至是1.2的应用程序。tIDE支持通过插件来扩展/增强其功能,当前提供的扩展工具包括:Bug查找工具(findbugs,PMD,Lint4J,JLint),代码修饰工具(AStyle,CheckStyle),分析工具(jad),代码混淆工具(ProGuard)。此外tIDE还提供一个工具用于从现有的 Eclipse...
* IBM JDK
IBM 的 Java开发工具,WebSphere 必须使用此开发工具才能运行
* Apache Harmony
Apache Harmony是Apache软件基金会的Java SE项目。 这个项目的目标是营造一个大型的、健康的社区,这个社区由那些对运行是平台感兴趣的人组成。他们的任务是完成: 一个兼容的、独立的Java SE 5 JDK的实现,并根据Apache License v2发布;一个由社区开发的模块化的运行时(包括java虚拟机和类库)体系结构。 该项目期望支持尽可能多的不同平台。一个特定的平台是否被支持,主要取决于参与者能在这个平台上定期运行测试、报告...
* IKVM.NET
IKVM.NET 的是开源的基于.NET CLR 的Java虚拟机。基于.NET的Java虚拟机意味着我们可以让Java程序跑在.NET上,可以通过虚拟机这个中介让Java程序和.NET应用程序一起协同工作。更难能可贵的是,IKVM同时支持微软的.NET Framework 和 Mono。IKVM的技术特性包括: 1.可以静态和动态(运行时)把Java的字节代码转换为.NET 的IL形式; 2.包括了一个Java的标准库,这个标准库已经静态编译成了.NET IL的形式; 3.提供力JNI 接口,可以让J...
* jdec
jdec是一个Java反编译器。它能够把出现在一个.class文件中的字节码还原成Java源代码,反编译的结果几乎与原始Java文件相同。它还自带一个利用swing开发的用户操作界面。
* UCDetector
这是一个Eclipse的插件,用来检测Java中的无用代码。
* SJPT
SJPT是一个分析工具包支持包括自顶向下(LL(1))和自底向上(LR(0), SLR(1), LR(1) and LALR(1))。该工具包同时支持为所有自底向上的分析法生成Java剖析器。
* J
J is a text editor written entirely in Java and distributed under the GNU General Public License.
* jarg
The jarg makes smaller a jar file in whitch java classes are stored
* DrJava
这是一个免费的、轻量型的开放源码 Java IDE,具有集成的读-计算-打印(read-eval-print)循环、调试器和 JUnit 支持。
* JBoss Developer Studio
红帽公司的 JBoss Developer Studio 是一款基于Eclipse的捆绑了开源工具软件和运行时间软件的集成开发环境(IDE)。 这款产品包括了JBoss Enterprise Middleware和Exadel公司的技术,可以提供一个循环的应用开发环境。名为Red Hat Developer Studio的测试版产品是在8月份推出的,从那时到现在它已经被下载了5万多次。 红帽公司产品营销经理Bryan Che说:“它整合了许多功能强大的富网络设计工具和AJAX应用软件。它还包括...
* Rhino
Rhino是用纯Java写成的JavaScript的开放源代码实现。它最常被用于嵌入Java应用程序,以便为终端用户提供脚本的能力。
* BlueJ
BlueJ is an integrated Java environment specifically designed for introductory teaching.
* Jikes
Jikes 是由IBM 开发出来的一个开放源码的Java编译器。它具有非常快速的编译速度和高度兼容性。
* SableCC
SableCC是一个用来生成编译器和分析器的面向对象的框架。这个框架是基于两个基本的设计决策:首先是利用面向对象技术自动构建精确的典型的抽象语法树。第二,这个框架使用经过扩展的Visitor访问者模式来生成tree-walker类。
* FreeCC
FreeCC (前身是 KawaDD) 是一个Java开发的语法、词法解析器生成器
* GCJ
GCJ(GNU Compiler for the Java Programming Language, GCJ)是多元的,高效的,具有前瞻性的java编译器。它可以编译java源代码,将java字节码转换成本地机器代码。目前支持的java版本最高 1.5,最新的1.6还不支持。 为什么要用GCJ?速度不是唯一的理由。他强大的分析工具,作为服务器开发的利器。他产生于JVM蜗牛时代,但今天的JVM已经不可同日而语了。...
* Grammatica
Grammatica是一个C#和Java的语法剖析器生成器(Parser Generator或叫作编译器的编译器:Compiler Complier) 。它相对于其它一些类似的工具如yacc和ANTLR有了更好的改进。这是因为Grammatica: 1.创建了更好的注释和易读的源代码. 2.拥有错误自动恢复并能够详述错误信息. 3.支持语法/词法测试与调试.
* Rats!
Rats! 是一个用来生成解析类似C语言的语法分析器,生成的解析器是Java语言的。
* CUP
一个LALR(Lookahead Left to Right Parsing)语法/词法分析生成器.
* Chaperon
Chaperon是一个可以把有结构的Text转换成XML.它包括一个强大的LALR(1)解析器来解析Text和一个可以用来创建XML文档的Tree builder。
* Excelsior JET
Excelsior JET是一款有提前编译技术的Java虚拟机增强工具(非开源)。提前编译器可以将您的类文件和jars文件转化成高度优化的二进制可执行文件,能够在 Intel x86平台的Microsoft Windows和 Linux系统中运行。同传统 JVM(Java虚拟机)中运行的原始类文件相比,这些经过优化的可执行文件具有更快的运行速度。另外,您的应用程序将会得到更好的保护,以防被篡改或窃取代码 ...
* JPackage
FC4 的发行说明中建议用户尽量避免直接使用 Sun 提供的 Java RPM,并提供了从 JPackage.org 构建 Java 的途径。 The JPackage Project has two primary goals: To provide a coherent set of Java software packages for Linux, satisfying all quality requirements of other applications. To establish an efficient and robust policy for Java software packaging and installation. ...
* runcc
runcc是一种在运行时生成parsers和lexers的语法分析生成器。它自带一个Java和XML分析器的例子。
* JTopas
JTopas 这个开源项目提供了一个很小,容易使用的用来分析特殊Text数据的Java类包。这些数据可以是来自包含一些注释的简单配置文件,HTML,XML,RTF stream,和来自其程序语言的源代码等。有时需要解释所有的Text数据,而有时只需解释其中重要的部分。
* Beaver
Beaver是一个LALR(1) 语法分析生成器。它读取一些上下文无关的语法并把它转换成一个利用该语法描述的语言分析器(一个Java类)。
* java2tcl
java2tcl 用来将Java代码转换成TCL代码。
* JBrownie
JBrownie is a companion tool for Java developers preferring to use plain text editors for writing programs over a resource hungry IDE. The downside of this is that the Java compiler has to be started manually, which may seriously slow down work. JBrownie addresses this problem by monitoring the source tree and automatically recompiling any modified Java source files on the fly. ...
* Antiplate
Antiplate 是一个用来创建通用 Java 项目结构的Ant 脚本,它创建了项目目录、属性文件、编译脚本以及通用的设置和编译目录。
*补充一个
JCreator Pro
这个是一个轻量级的JAVA开发工具
目前版本5(我正在使用4.5)
真的简洁吗?
别人博客上看到这样一篇文章:
喜欢C,没有理由,追求短代码~~我想没有一门语言可以达到这样的效果~~本来已经很精简的程序在熟练的程序员手上能够缩减到原长度的1/4,而且功能没有任何差别~
两段完全一样的代码~~
#include <stdio.h>
void main()
{
int k[]={100,50,10,5,2,1},n,m,i,j,t;
while(scanf("%d",&n))
{
if(n==0) break;
t=0;
for(i=0;i<n;++i)
{
scanf("%d",&m);
for(j=0;j<6;++j)
while(m>=k[j])
++t,m-=k[j];
}
printf("%d\n",t);
}
}
缩减后:我爱C语言丶__唯美
main()
{
int k[]={100,50,10,5,2,1},n,m,i,t,s;
for(;scanf("%d",&n),n;printf("%d\n",t))
for(t=i=0;i<6*n;t+=s=m/k[i%6],m-=s*k[i++%6])
scanf(i%6?"":"%d",&m);
}
这就是C的魅力所在~我爱C语言~~
我觉得这是一个误区,优秀的代码在节省空间的情况下不应以牺牲运行效率和可读性为代价,上面的代码,原来的代码看了就知道用途(最少第四版人民币的数量),可是看了下面那段代码,你几遍能读懂它的意思?
我觉得写代码应该在可读性(易于别人阅读、管理)和时间效率(速度)上找到平衡,代码长度应该被忽略,毕竟看似短的代码编译之后未必很短短:
(Dev c++ 4.9.9.2)
上面的代码19970 b
下面的代码18946 b
两者都占用硬盘都是 20480 b