正文

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

阅读(4849) | 评论(4)


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

评论

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