2007年6月9日星期六

输出自己的代码(Print Out Your SourceCode)

和OI没什么太大关系,算是熟悉语言了。
很久以前就看到了这个问题,看网上流传比较广的是这一段代码:
#include <stdio.h>
char*f="#include <stdio.h>%cchar*f=%c%s%c;%cint main(){printf(f,10,34,f,34,10,10);return 0;}%c";
int main(){printf(f,10,34,f,34,10,10);return 0;}
仔细看看就知道这个方法其实挺简单。我自己先了一个方法,用C/C++的宏__FILE__,这个方法貌似比较BT,具体C/C++怎么实现的这个宏我也不太清楚,哪位高人指点一下?
#include <fstream>

using namespace std;

int main()
{
ifstream fin(__FILE__);
ofstream fout("out.cpp");
char temp;
while (!fin.eof())
{
fin.get(temp);

fout<<temp;
}
return 0;
}
到网上一找,找到很多更BT的代码,给链接

2007年5月6日星期日

NOIP竞赛语言和评测平台

NOIP2005比赛环境规范依照兼顾Windows、Linux平台、统一编译器、提供多种集成开发环境选择的原则制定。
NOIP2005 比赛环境中,操作系统平台可依各地的实际情况选择Windows或者Linux;在固定的操作平台下,对应不同的语言,使用统一的编译器,消除编译器不同 给选手带来的不利影响;对应每种语言,提供了多种集成开发环境,选手可以根据自己的习惯选择集成开发环境。
在全国测评时,评测环境保持与比赛环境的操作系统及编译器一致。也就是说全国评测时,使用与选手比赛时一致的平台对选手的程序进行评测,以消除平台不一致带来的不利影响。
以下是NOIP2005比赛环境要求的详细描述: 1、使用Windows操作系统平台:
1)Windows操作系统必须使用Windows2000、Windows XP及更新的Windows版本;
2)Pascal语言,必须使用Free Pascal 1.0.10及以上版本作为编译器;
3)C语言,必须使用gcc.3.4.2作为编译器;
4)C++语言,必须使用g++ 3.4.2作为编译器;
5)Pascal语言,可以使用Freepascal IDE Windows版、Lazarus Windows版、Dev-Pascal作为集成开发环境,推荐使用Lazarus Windows版;
6)C和C++语言,可以使用Dev-C++、RHIDE Windows版作为集成开发环境,推荐使用Dev-C++;
2、使用Linux操作系统平台:
1)Linux操作系统必须使用Red Hat Linux 9.0,安装时必须安装Red Hat Linux 9.0自带的开发工具包;
2)Pascal语言,必须使用Free Pascal 1.0.10及以上版本作为编译器;
3)C语言,必须使用gcc.3.2.2作为编译器;
4)C++语言,必须使用g++ 3.2.2作为编译器;
5)Pascal语言,可以使用Lazarus Linux版、RHIDE Linux作为集成开发环境,推荐使用Lazarus Windows版;
6)C和C++语言,可以使用RHIDE Linux版、KDevelop、Anjuta作为集成开发环境,推荐使用Anjuta;


这个是2005年的,做个参考。

2007年4月28日星期六

2007年3月30日星期五

C++ 除号(/)和取余(%)操作符 vs 负数

当C++ 除号(/)和取余(%)操作符遇到负数的时候,就会有奇异的事情发生……
如果两个操作数为正,除法和取模操作的操作的结果也是正数(或零);如果两个操作数都为负数,除法的操作的结果也为正数(或零),而求模操作的结果则为负数(或零);如果只有一个操作数为负,这两种操作的结果取决于机器;求模结果的符号也取决于机器,而除法操作的值则是负数(或零):

C++ Primer中文第四版130页

底下有几个例子,略去了。大概是说,21%-5可以等于1或-4,21/-5可以等于-4或-5。
在gcc(Linux版,Windows应该也一样)下试了一下:
21%-5=1
21/-5=-4
就是说,取余操作的符号取决于分子,结果向零一侧取整,除法的结果直接把小数截去。
USACO上一个题(Broken Necklace)需要mod函数,他是这样解决的:
/*
* Return n mod m. The C % operator is not enough because
* its behavior is undefined on negative numbers.
*/
int
mod(int n, int m)
{
while(n < 0)
n += m;
return n%m;
}

begin

在这里写下OI过程中的点点滴滴……