每日一小练——数值自乘非递归解

题目:数值自乘非递归解


内容:

连续求m^n问题(m与n是正整数)。前面的提示会得到一个递归程序,请编写一个运算效率同样高的非递归的程序。

 

我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神。。奥,不对就解决了!如果是非递归其实一种简单的方法就是把,

递归的几种分类做好if分支,用一个循环处理就好了,不过如果我们认真思考m^n这个式子,我们会发现n如果用二进制表示的话如:2^7可改写为

2^0111即为2^(2^0) x 2^(2^1) x 2^(2^2) ,所以其实所用的数都能用这样的方式表示的:i1*m^(2^0)+i2*m^(2^1)+.... 

而m^(2^(i+1))=m^(2^i*2)=(m^(2^i))^2=m^(2^i)*m^(2^i)所以我们就可以利用这些原理进行循环了。

 

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int _tmain(int argc, _TCHAR* argv[])  
  5. {  
  6.     unsigned long int recursion(unsigned long int base, unsigned long int index);  
  7.     unsigned long int base, index;  
  8.     cout << "请输入底数:" << endl;  
  9.     cin >> base;  
  10.     cout << "请输入指数:" << endl;  
  11.     cin >> index;  
  12.     cout << base << "的" << index << "次方为:" << recursion(base, index) << endl;  
  13.     getchar();  
  14.     getchar();  
  15.     return 0;  
  16. }  
  17.   
  18. unsigned long int recursion(unsigned long int base, unsigned long int index)  
  19. {  
  20.     unsigned long int temp = 1;  
  21.     while (index > 0)  
  22.     {  
  23.         if (index & 0x01 == 1)  
  24.             temp *= base;  
  25.         base *= base;  
  26.         index >>= 1;  
  27.     }  
  28.     return temp;  
  29. }  

实验结果:



欢迎大家加入每日一小练,嘿嘿!

每天练一练,日久见功夫,加油!


            -End-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值