恩,把以前没做的弱题做了一遍,发现自己对繁琐细节的处理实在差劲。比如这道题不难,就是大数的加法、大数的比较。翻来覆去写了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;}

评论