恩,把以前没做的弱题做了一遍,发现自己对繁琐细节的处理实在差劲。比如这道题不难,就是大数的加法、大数的比较。翻来覆去写了160多行,从饭前的无聊到看完书的愤懑,横跨5个多小时,假如是张白纸,早就被笔迹划成渣了。
惊奇的是,不知不觉,终于做到300题了。
请原谅我把“惊奇”“不知不觉”和“终于”这三个互相矛盾的词放在一起。(迷之音:重点,重点是「不炫耀会死」呀......)>_<
的确做了很久zoj,与此同时,考研就如悬在头顶的达摩克利斯之剑。做题只是爱好,从悲观的角度看,更像是一种逃避——好像一进入编程世界,考研就离自己好遥远了——当然,我还不曾如此悲观,我对于社会主义精神文明的热爱不逊于此。
就比作Relax吧。青罗曼纱,轻烟袅袅,眼明心净,在算法的海洋里享受无穷乐趣,打住,这不是小说。现实是,我的前方是修过三次的17寸平显,我的正下方有一个铁盒,发出持续不断的奇怪噪音,让你想起哥斯拉、大魔王、宿舍楼下的汽车修理厂。我就坐在那里,时而把脸挤成三阶矩阵,时而把手绞作二维曲线,以向入土了两百多年的数学家们致敬;至于大脑内部发生了正弦变换或者傅立叶变换,这和我无关,我也不想知道。重要的是,我做不出来,只好去看帖。
当然这是......恩,多数。少数情况下,我运指如飞,一行行闪烁着人文主义关怀的代码呈现不停。这样的题目有:1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001,1001
......其实一直在进步,不是么?希望考研结束的那一天,我也能这样对自己说。
大数加法模版之一:用int来代替数字位真是失败!!!!(呜,我也变成最讨厌的感叹号×4人了)
#include <cstdio>
#include <string>
const int max_int = 102;
typedef struct long_int
{
int dig[max_int], len;
} Lint;
Lint a[1000];
int size;
Lint add(Lint x, Lint y)
{
if(x.len < y.len) //保证x比y大
{
Lint t;
t.len = x.len;
memcpy(t.dig, x.dig, max_int);
x.len = y.len;
memcpy(x.dig, y.dig, max_int);
y.len = t.len;
memcpy(y.dig, t.dig, max_int);
}
int i, ti, c = 0;
for(i = 0; i < y.len; i ++) //从0位到高位倒着排
{ //累计y的部分
ti = (x.dig[i] + y.dig[i] + c) % 10;
c = (x.dig[i] + y.dig[i] + c) / 10;
x.dig[i] = ti;
}
if(x.len == y.len) //累计x比y多的部分
{
if(c)
{
x.dig[x.len ++] = 1;
}
}
else
{
for(i = y.len; i < x.len; i ++)
{
ti = (x.dig[i] + c) % 10;
c = (x.dig[i] + c) / 10;
x.dig[i] = ti;
}
if(c)
{
x.dig[x.len ++] = 1;
}
}
return x;
}
bool gt(Lint x, Lint y)
{ //先比较位数
if(x.len > y.len) return true;
if(x.len < y.len) return false;
else //一样则逐位比较
{
int i;
for(i = 0; i < x.len; i ++)
{
if(x.dig[x.len - i - 1] < y.dig[x.len - i - 1])
return false;
if(x.dig[x.len - i - 1] > y.dig[x.len - i - 1])
return true;
}
return true;
}
}
void pa()
{
int i, k;
for(i = 1; i < 510; i ++)
{
for(k = a[i].len - 1; k >= 0; k --)
{
printf("%d", a[i].dig[k]);
}
printf(" %d\n", a[i].len);
}
}
void pt(Lint l)
{
int i;
for(i = 0; i < l.len; i ++)
{
printf("%d", l.dig[l.len - i - 1]);
}
printf(" %d\n", l.len);
}
void init()
{
a[0].dig[0] = 1, a[0].len = 1;
a[1].dig[0] = 2, a[1].len = 1;
int i;
for(size = 2; size < 1000; size ++)
{
a[size].len = add(a[size - 1], a[size - 2]).len;
if(a[size].len == max_int) break;
for(i = 0; i < a[size].len; i ++)
{
a[size].dig[i] = add(a[size - 1], a[size - 2]).dig[i];
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
init();
char l0[max_int], l1[max_int];
while(scanf("%s %s ", &l0, &l1))
{
if(l1[0] == '0') break;
int i, l, r;
Lint x0, x1;
x0.len = strlen(l0), x1.len = strlen(l1);
for(i = 0; i < x0.len; i ++)
{
x0.dig[i] = l0[x0.len - i - 1] - '0';
}
for(i = 0; i < x1.len; i ++)
{
x1.dig[i] = l1[x1.len - i - 1] - '0';
}
for(i = 0; i < size; i ++)
{
if(gt(a[i], x0))
{
l = i; break;
}
}
for(i = l; i < size; i ++)
{
if(!gt(x1, a[i]))
{
r = i; break;
}
}
printf("%d\n", r - l);
}
return 0;
}
评论