Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82430
  • 博文数量: 17
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-17 21:47
文章分类

全部博文(17)

文章存档

2011年(1)

2008年(16)

我的朋友
最近访客

分类: C/C++

2008-03-04 20:14:06

把数字m1表示为: m1 = a[t] * 10^t + a[t-1] * 10^(t-1) + ... + a[2] * 10^2 + a[1] * 10 + a[0];
其中a[0] - a[t]表示个位到最高位。
把数字m2 = b[k] * 10^k + b[k-1] * 10^(k-1) + ... + b[2] * 10^2 + b[1] * 10 + b[0];

m1 * m2就是
(a[t] * 10^t + a[t-1] * 10^(t-1) + ... + a[2] * 10^2 + a[1] * 10 + a[0]) * 
(b[k] * 10^k + b[k-1] * 10^(k-1) + ... + b[2] * 10^2 + b[1] * 10 + b[0])。
如果t,k都是大于2的,乘积中对于a[3] - a[t], b[3] - b[k]相乘的部分肯定是超过1000的,这些可以忽略。也就是说m1 * m2的个位 - 百位其实和
(100*a[2] + 10*a[1] + a[0]) * (100*b[2] + 10*b[1] + b[0])
是一样的。

(100*a[2] + 10*a[1] + a[0]) * (100*b[2] + 10*b[1] + b[0])
= 10000*a[2]*b[2] + 1000*a[2]*b[1] + 100*a[2]*b[0]+
1000*a[1]*b[2] + 100*a[1]*b[1] + 10*a[1]*b[0]+
100*a[0]*b[2] + 10*a[0]*b[1] + a[0]*b[0]
再去掉肯定超过1000的, 得到简化后的结果:100*a[2]*b[0] + 100*a[1]*b[1] + 10*a[1]*b[0] + 100*a[0]*b[2]+10*a[0]*b[1]+a[0]*b[0];

按这个思路,代码如下:
int f(m1, m2)
{
  int a2 = m1/100%10;
  int a1 = m1/10%10;
  int a0 = m1%10;

  int b2 = m2/100%10;
  int b1 = m2/10%10;
  int b0 = m2%10;

  int res = 100*a2*b0 + 100*a1*b1 + 10*a1*b0 + 100*a0*b2 + 10*a0*b1 + a0*b0;
  res = res % 1000;
  return res;
}
 

int res = 0;
for (int i = 0; i  < n; i++)
{
  res = f(m, res);
}
 
 
阅读(739) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~