2的10000次方

千杯不醉-sen 2010-01-09 04:08:12
编写一个算法,求2的10000次方。
要求:显示所有的结果。
...全文
1266 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaoyukun111 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fengxuxing 的回复:]
C/C++ code
#include<stdio.h>constint COUENT=9999;int main()
{int result[10000]= {0};
result[0]=2;//进位:carry,当前位数:bitint carry=0, bit=1, multi=0;for(int i=0; i< COUENT; i++)
{
carry=0;for(int j=0; j< bit; j++)
{
multi= result[j]*2+ carry;
carry= multi/10;
result[j]= multi%10;if((j+1)== bit)
{if(carry>0)
{
result[bit]= carry;
bit++;break;
}
}
}
}for(int i= bit-1; i>=0; i--)
{
printf("%d", result[i]);
}
printf("\n");
}
答案和四楼是一致的
[/Quote]

这个看着简单多了
  • 打赏
  • 举报
回复
用大数库,gmp
千杯不醉-sen 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wanghao111 的回复:]
要使用大数定理,楼主看看吧
[/Quote]

能具体一些吗?
lixiaolicauc 2010-01-09
  • 打赏
  • 举报
回复
DLevel 2010-01-09
  • 打赏
  • 举报
回复
这程序肯定不能一直去那递归了。递归到一定层级就失败

如果我的话,我这么做

#define TWO 4
#define TEN 1024
#define HUN *********

然后在用上边代码,减少N的量级。。。
wuxiaohu 2010-01-09
  • 打赏
  • 举报
回复
使用数组,采取进位的方式
FancyMouse 2010-01-09
  • 打赏
  • 举报
回复
>时间复杂度是O(lgn)
只是只需要做O(logn)次乘法。高精乘法难道可以常数做掉么
lovesi3344 2010-01-09
  • 打赏
  • 举报
回复
unbelievele
Qlaiaqu 2010-01-09
  • 打赏
  • 举报
回复

#include <stdio.h>

const int COUENT = 9999;
int main()
{
int result[10000] = {0};
result[0] = 2;
//进位:carry,当前位数:bit
int carry = 0, bit = 1, multi = 0;
for(int i = 0; i < COUENT; i++)
{
carry = 0;
for(int j = 0; j < bit; j++)
{
multi = result[j] * 2 + carry;
carry = multi / 10;
result[j] = multi %10;
if((j+1) == bit)
{
if(carry > 0)
{
result[bit] = carry;
bit++;
break;
}
}
}
}
for(int i = bit - 1; i >= 0; i--)
{
printf("%d", result[i]);
}
printf("\n");
}

答案和四楼是一致的
jx8904020853 2010-01-09
  • 打赏
  • 举报
回复
有个快速指数算法,可以看看,时间复杂度是O(lgn)
CCCCCCCCCCCCCCC 2010-01-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#define DIGMAX 100000

void add(char *s1, char *s2, char *sum)
{
int g = 0, i, j;
while (*s1 || *s2) {
i = *s1 ? *s1++ - '0' : 0;
j = *s2 ? *s2++ - '0' : 0;
*sum++ = (i+j+g) % 10 + '0';
g = (i+j+g) / 10;
}
while (g) {
*sum++ = g % 10 + '0';
g /= 10;
}
*sum = '\0';
}

void mutiply(char *s1, char *s2, char *acc)
{
char f1[DIGMAX], f2[DIGMAX];
int len1 = strlen(s1);
int len2 = strlen(s2);
int i, j, k, g;
acc[0]='0'; acc[1]='\0';
for (i=0; i<len2; i++) {
*f1 = '\0';
g = 0;
for (k=0; k<i; k++)
strcat(f1, "0");
for (j=0; j<len1; j++,k++) {
f1[k] = ( s1[j] - '0' ) * ( s2[i] - '0' ) + g;
g = f1[k] / 10;
f1[k] = f1[k] % 10 + '0';
}
while (g) {
f1[k++] = g % 10 + '0';
g /= 10;
}
f1[k] = '\0';
strcpy(f2, acc);
add(f1, f2, acc);
}
}

int main()
{
char s[10], re[DIGMAX], f[DIGMAX];
int i, j, n, p, g, l;
while (scanf("%s %d",s, &n) == 2) {
for (p=i=0, j=strlen(s)-1; j>=0 && s[j]!=' '; j--)
if (s[j] != '.')
re[i++] = s[j];
else
p = i*n;
while (re[i-1]=='0')
re[--i] = '\0';
re[i] = '\0';
strcpy(s, re);
while (--n) {
strcpy(f, re);
mutiply(f, s, re);
}
i = 0; l = j = strlen(re);
while (p>0 && re[i]=='0') {i++; p--; l--;}
if (p>=l) {
putchar('.');
while (p>l) {putchar('0'); p--;}
while (--j >= i) putchar(re[j]);
} else {
while (l>p) {putchar(re[--j]); l--;}
if (j>i) putchar('.');
while (j>i) putchar(re[--j]);
}
putchar('\n');
}
}



VC6下,输入2,换行,输入10000,回车,出结果

#define DIGMAX 100000 这里没去算,随手写的,大了,可自己调整
selooloo 2010-01-09
  • 打赏
  • 举报
回复
上面错了,改下


#include <stdio.h>
#include <stdlib.h>

char *Add(char *s1,char *s2)
{
char c,c1,c2;
int i=0,j=0,k=0,i1=0,m;
while(*(s1+i)!=0)
i++;
while(*(s2+i1)!=0)
i1++;
m=k=i>i1?i:i1;
while(k!=0)
{
k--;i--;i1--;
c1=(i>=0)?(*(s1+i)-'0'):0;
c2=(i1>=0)?(*(s2+i1)-'0'):0;
c=c1+c2;
if(c<10)
{
if(c+j>=10)
{
s1[k]='0'+c+j-10;
j=1;
}
else
{
s1[k]='0'+c+j;
j=0;
}
}
else
{
c-=10;
s1[k]='0'+c+j;
j=1;
}
}
if(j==1)
{
for(i=m;i>0;i--)
s1[i]=s1[i-1];
s1[i]='1';

}
s1[m+1]=0;
return s1;
}
char * nsquare(int n)
{
char *ss=(char *)calloc(n,sizeof(char));
int i;
ss[0]='1';
for(i=0;i<n;i++)
ss=Add(ss,ss);
return ss;
}
int main(void)
{
char *r;
FILE *fp=fopen("d:\\rrr.txt","w");
int i;
for(i=0;i<10000;i++)
{
r=nsquare(i);
fprintf(fp,"%s\n",r);
free(r);
}
getchar();
return 0;
}

selooloo 2010-01-09
  • 打赏
  • 举报
回复
计算1-10000的次方,这个需要点时间

#include <stdio.h>
#include <stdlib.h>

char *Add(char *s1,char *s2)
{
char c,c1,c2;
int i=0,j=0,k=0,i1=0,m;
while(*(s1+i)!=0)
i++;
while(*(s2+i1)!=0)
i1++;
m=k=i>i1?i:i1;
while(k!=0)
{
k--;i--;i1--;
c1=(i>=0)?(*(s1+i)-'0'):0;
c2=(i1>=0)?(*(s2+i1)-'0'):0;
c=c1+c2;
if(c<10)
{
if(c+j>=10)
{
s1[k]='0'+c+j-10;
j=1;
}
else
{
s1[k]='0'+c+j;
j=0;
}
}
else
{
c-=10;
s1[k]='0'+c+j;
j=1;
}
}
if(j==1)
{
for(i=m;i>0;i--)
s1[i]=s1[i-1];
s1[i]='1';

}
s1[m+1]=0;
return s1;
}
char * nsquare(int n)
{
char *ss=(char *)calloc(n,sizeof(char));
int i;
ss[0]='1';
for(i=0;i<n;i++)
ss=Add(ss,ss);
return ss;
}
int main(void)
{
char *r;
FILE *fp=fopen("d:\\rrr.txt","w");//结果保存在d:\\rrr.txt
int i;
for(i=0;i<10000;i++)
{
r=nsquare(10000);
fputs(r,fp);
free(r);
}
getchar();
return 0;
}

haohaokingXP 2010-01-09
  • 打赏
  • 举报
回复
方案1 C++中POWER函数是能够表示下的,只是结果是double类型的。

double pow ( double base, double exponent );
long double pow ( long double base, long double exponent );
float pow ( float base, float exponent );
double pow ( double base, int exponent );
long double pow ( long double base, int exponent );
而double类型的话,能够表示范围是
有double类型存储机制问题,64位是这样存储的: 1位符号位,11位指数位,52位尾数位
double是能够表示下这个数的,如果不要求精度的话,可以试试这个。

方案2
按每一位对应的值转换成数组,利用超大数相乘的原理来解决该问题。
PS:刚才写了一个,还没有调试,就要上班去了。。。。。。。。。。。

selooloo 2010-01-09
  • 打赏
  • 举报
回复
2的10000次方
19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376
z569362161 2010-01-09
  • 打赏
  • 举报
回复
基本思路,用递归进行运算.截止到10000次.用数组储存.
a294392285 2010-01-09
  • 打赏
  • 举报
回复
以前看过大数,也不太清楚,好像是重载后的东西。
wanghao111 2010-01-09
  • 打赏
  • 举报
回复
要使用大数定理,楼主看看吧
千杯不醉-sen 2010-01-09
  • 打赏
  • 举报
回复
http://hi.csdn.net/space-2580999-do-thread-id-3868.html

这个应该可以吧?再不出来我就疯啦.....
千杯不醉-sen 2010-01-09
  • 打赏
  • 举报
回复


我的运行结果,不知道能显示不。
加载更多回复(2)

69,382

社区成员

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

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