正文

Zju 1962 How Many Fibs?2006-11-24 22:30:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/20746.html

分享到:

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

阅读(4940) | 评论(4)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册