2的N次方的高效率算法 N在10000左右

iLeoDo 2013-02-20 09:48:35
求2的N次方有没有什么高效率运算啊, N在10000左右。
以下是我的解法。。没有什么可靠依据

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10000

int main(int argc, char *argv[]) {
int n;
scanf("%d",&n);
char result[N];
int i;

for(i=0;i<N;i++){
result[i]=0;
}

result[N-1] = 2;
char offset = 0;
int j;
for(i=1;i<n;i++)
{
int flag = 0;
j = N-1;
while (1) {
if(result[j]+offset==0){
if(++flag==5) //我查了2的乘方表,发现连续有五个0,就意味着没有更多的位数了。这是我的想法。
break;
}
else flag = 0;
result[j] = 2*result[j] + offset;
if(result[j]>=10)
{
offset = 1;
result[j] = result[j] - 10;
j--;
continue;
}
offset = 0;
j--;
}
}

// for (j=j;j<N;j++ )
// {
// printf("%c",result[j]+'0');
// }
// printf("\n");

int sum=0;
for(i=j;i<N;i++)
{
sum = sum + result[i];
}
printf("%d",sum);
}
...全文
1831 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hping1016 2013-02-23
  • 打赏
  • 举报
回复
引用 18 楼 nice_cxf 的回复:
引用 16 楼 hping1016 的回复:引用 10 楼 nice_cxf 的回复:引用 7 楼 hping1016 的回复:1楼说的对,如果是2的N次幂求值,就是将直接1左移N位。 但是受计算机数据类型的限制,在windows平台下的32位操作系统机器上最大整数位long long,也就是64位。64位操作系统的机器,最大位数是128位。也就是说在指数小于等于128……
你说的对,我把大数相乘给忽略了。。。。。。
卦星 2013-02-22
  • 打赏
  • 举报
回复
是不是每执行一次都要从N-1到j,好像效率并不高啊
卦星 2013-02-22
  • 打赏
  • 举报
回复
怎么感觉没看懂呢,菜鸟%
nice_cxf 2013-02-22
  • 打赏
  • 举报
回复
引用 16 楼 hping1016 的回复:
引用 10 楼 nice_cxf 的回复:引用 7 楼 hping1016 的回复:1楼说的对,如果是2的N次幂求值,就是将直接1左移N位。 但是受计算机数据类型的限制,在windows平台下的32位操作系统机器上最大整数位long long,也就是64位。64位操作系统的机器,最大位数是128位。也就是说在指数小于等于128的时候可以直接使用这种简单的移位运算。 ……
你给的那个函数能满足10000次幂么?返回值都是long,这题必然要用到大数乘法
赵4老师 2013-02-22
  • 打赏
  • 举报
回复
13楼main函数改为
int main() {
    string s1,s2,res;

		s1="1";
		s2="2";
		for (int i=1;i<=10000;i++) {res=MUL_INT(s1,s2);s1=res;}
        cout<<res<<endl;
    return(0);
}
运行约36秒,结果: 199506311688075838……774304792596709376 共3011位。
Kaile 2013-02-21
  • 打赏
  • 举报
回复
2048位已经很大了吧,不知道1万位有什么用。 找个库就OK C++大数库简介
hping1016 2013-02-21
  • 打赏
  • 举报
回复
引用 10 楼 nice_cxf 的回复:
引用 7 楼 hping1016 的回复:1楼说的对,如果是2的N次幂求值,就是将直接1左移N位。 但是受计算机数据类型的限制,在windows平台下的32位操作系统机器上最大整数位long long,也就是64位。64位操作系统的机器,最大位数是128位。也就是说在指数小于等于128的时候可以直接使用这种简单的移位运算。 《数据结构与算法分析》mark.Alle……
是我没讲明白吗?还是你没看明白? 我这段话是说的1楼所述移位法的局限。即:只能适用于2进制、且指数小于128的情形。
leizh007 2013-02-20
  • 打赏
  • 举报
回复
首先大数,其次:

x=1;
k=1;
whle(n)
{
if(n%2==1)
x=x*k;//当然这里得是大数乘法
k=k*2;
n=n/2;
  • 打赏
  • 举报
回复
那啥,想到另外一个办法,查表法。 把要查范围的得数都放在一个表中,要计处多少次,就查哪个。空间换时间。
nice_cxf 2013-02-20
  • 打赏
  • 举报
回复
引用 7 楼 hping1016 的回复:
1楼说的对,如果是2的N次幂求值,就是将直接1左移N位。 但是受计算机数据类型的限制,在windows平台下的32位操作系统机器上最大整数位long long,也就是64位。64位操作系统的机器,最大位数是128位。也就是说在指数小于等于128的时候可以直接使用这种简单的移位运算。 《数据结构与算法分析》mark.Allen.weiss中提供的分治算法可以用于解决……
题目已经说了,n大概1万左右,你非要说指数小于128。。。。
sfd1234 2013-02-20
  • 打赏
  • 举报
回复
很高啊,我是来学习的!!!
  • 打赏
  • 举报
回复
1楼和4楼已经解决,等待结贴接分
hping1016 2013-02-20
  • 打赏
  • 举报
回复
1楼说的对,如果是2的N次幂求值,就是将直接1左移N位。 但是受计算机数据类型的限制,在windows平台下的32位操作系统机器上最大整数位long long,也就是64位。64位操作系统的机器,最大位数是128位。也就是说在指数小于等于128的时候可以直接使用这种简单的移位运算。 《数据结构与算法分析》mark.Allen.weiss中提供的分治算法可以用于解决任意情形的指数运算(或者称为幂运算),是一个典型算法。
bool isEven(int n)
{
	return n%2 == 0;
}
long pow(long x, int n)
{
	if (n == 0)
		return 1;
	if (n == 1)
		return x;
	if(isEven(n))
		return pow(x*x, n/2);
	else
		return pow(x*x, n/2)*x;
}
nice_cxf 2013-02-20
  • 打赏
  • 举报
回复
必然要用大数乘法,2^16=65536,类似这样反复乘就可以了,直到剩余部分小于2^16,然后查表直接乘剩余部分
阿麦 2013-02-20
  • 打赏
  • 举报
回复
还可以进一步提高效率: 由于9*16=144 < 256,所以可以一次计算 *16(2^4),当算后指数还没完,再用 ^2 比如(这里n小些,能说明问题就成): 2^11 = (2^4) * (2^4) * (2^2) * (2^1)
阿麦 2013-02-20
  • 打赏
  • 举报
回复
本题的特殊性: x*2=x+x。用加法来替代乘法 或 x*2 = x << 1。用位移来替代乘法 然后,剩下的就是大数加法了。一般做法是用数组来存每一位 建议不要用Flag连续5个0来表示没有更高位,毕竟这不严谨。 可以记录每次加完后的最高位(本题的特殊性:最多比前一次多一位)
清天灵月 2013-02-20
  • 打赏
  • 举报
回复
引用 1 楼 luciferisnotsatan 的回复:
什么意思?题目没看明白。2的1次,10,2次100,3次100,N次,不就是在第N位是个1,其他都是0么。要循环干吗?
高手啊!
dubiousway 2013-02-20
  • 打赏
  • 举报
回复
char bigNumber[10000/8];//用字符数组标示这么大的幂次吧。
luciferisnotsatan 2013-02-20
  • 打赏
  • 举报
回复
什么意思?题目没看明白。2的1次,10,2次100,3次100,N次,不就是在第N位是个1,其他都是0么。要循环干吗?
iLeoDo 2013-02-20
  • 打赏
  • 举报
回复
很有用啊。大家给的方法。我外面嵌套了个循环是为了计算幂运算结果的每一位的和
加载更多回复(2)

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧