显示标签为“C”的博文。显示所有博文
显示标签为“C”的博文。显示所有博文

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年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;
}