我是大一新生,計概有一項作業
題目:2+4+....+2的100次方
問題:我用unsigned,最大只能存到4294967295
那...2的40次方以上 要怎麼存?
2006-10-03 19:46:25 · 4 個解答 · 發問者 Otaku Man 1 in 電腦與網際網路 ➔ 程式設計
我算2的100次方=?
#include"stdio.h"
#include"stdlib.h"
int main()
{
long double x=1;
int i;
for(i=0;i<100;i++)
{
x=x*2;
}
printf("%d",x);
system("pause");
return 0;
}
可以嗎?
2006-10-03 21:15:43 · update #1
想法:2乘上2的100次方減一除以2減一 等比級數的公式
所以要先算出2的100次方...
順便問一下long double 跟double的用途?
PS:一次只能300個字,所以分兩次打,SORRY....
2006-10-03 21:18:04 · update #2
#include"stdio.h"
#include"stdlib.h"
int main()
{
long double x;
x=2222222;
printf("%d",x);
system("pause");
return 0;
}
2006-10-04 10:39:25 · update #3
我還是不大會用long double之類的相關字...
那個不是能存到小數點下好幾位(比float還多)
可是我要存的是很大的數耶..
上面是我自己測試的程式碼
可是跑出來是0耶...
2006-10-04 10:47:07 · update #4
不過我把之前的程式碼%d改成%lf
跑出來怎麼是-0.000000?
2^100是程式碼2的100次方的意思嗎?
重點:我的功課我還是沒有頭緒阿...
2的100次方該怎麼表示..
今天還多個問題...要表示到2314294967295....
2006-10-04 20:39:40 · update #5
用 double, 再不行, 用 long double
不過,這會有誤差;
在你這題,誤差不會太嚴重。
你才大一,這個誤差老師應該會接受。
為了讓你會程式,就不寫 code 給你看了。
加油!
2006-10-04 12:43:33 補充:
2^100 = 126765060022822940149670320537632 位數,就算用 long double 也會有誤差!所以,long double 2^100 -1 = long double 2^100!不過,用公式轉換成較簡單的數學,再寫程式,是正確的做法。在一些情況下,轉換過的數學,誤差反而會比較大!所以,要用不太一樣的數學去轉換。你這題沒有上述的問題:用等比去做就對了!
2006-10-04 12:45:59 補充:
int, long int, unsigned int ... 是整數,只能算出整數值,但沒有誤差。(除了除法:它只能算出整數商。)float, double, long double 是浮點數,能算出小數或很大的數。但,有誤差。簡言之,float 有效位數約 7 位,double 約 15 位,long double (好像是) 約 22 位。有關誤差,可參http://tw.knowledge.yahoo.com/question/?qid=1106071611406
2006-10-04 12:48:51 補充:
大一新生版主:
您若是電算系的,大數算法要學喔!
可參〝這!就是差距〞提供的網站。
若不是,對程式設計也沒多大興趣,可以不用學它。
2006-10-04 21:17:03 補充:
long double x; x=2222222; printf("%d",x); float 浮點數:簡單而言(不太正確的說法)就是浮動小數點。它是把一個 正負 1.xxxxx 的數 乘上 10 的 正負 yyy 次方;所以,可以表示蠻大一個範圍的數值。float 大約是用 4 個 byte,double 是 8 個,long double 好像是 10 個(可以用 sizeof ( ) 去查一下)。
2006-10-04 21:17:24 補充:
float 和 double 的 printf 參數是printf("%f", x);long double 的 printf 通常是printf("%lf", x);你用 %d ,那是 10 進位整數的參數,所以印出不對。
2006-10-05 18:13:11 補充:
2^100 用 power(2,100);要 include
2006-10-05 18:27:17 補充:
若不管誤差,這程式只要#include
2006-10-05 18:59:51 補充:
若要精準,要用多個整數去做。標準做法是用陣列:#include
2006-10-05 19:03:41 補充:
{a[j] -= N; if (j<3) // a[3] 若進位(這題不會)不能加到 a[4]! a[j+1]++; } } a[0]--; printf("%ld%09ld%09ld%09ld\n", a[3], a[2], a[1], a[0]); return 0;}
2006-10-05 19:06:43 補充:
<< 是整數 *2a <<= 1;就是a = a * 2;
2006-10-06 11:57:51 補充:
我寫的那2個版你弄不出來嗎?
2007-07-17 10:34:22 補充:
我把我知道最快的次方程式的非大數版 post 在下面。
http://www.phpbbserver.com/graphicsparalle/viewtopic.php?t=42
再過一陣會 post 大數的部份。有興趣 / 需要的,可以去看一看。
2006-10-03 20:29:19 · answer #1 · answered by ? 7 · 0⤊ 0⤋
如果只是加法,用兩個陣列就解決了
2006-10-04 09:15:08 補充:
發問者會用陣列嗎?
2006-10-05 09:56:29 補充:
log 2 = 0.301
雖然2^100 約等於0.301*100=30.1 <- 31位數
1個double 數字最多約40 億就算是有號數 也可以到20億
所以用到10 億就好,每個double 可放 0 ~ 999,999,999 九位數
這個題目一共要用到31位數,這不是9的倍數。
所以只能多不能少,就用4個double 。
void main()
{
long a[4],b[4],i,j;
for(i=0;i<4;i++)
{
a[i]=0;
b[i]=0;
}
a[0]=2
for(i=1;i<=100;i++)
{
for(j=0;j<4;j++)
{
b[j]=b[j]+a[j];
}
for(j=0;j<3;j++)
{
if(b[j]>1000000000)
{
b[j]=b[j]-1000000000;
b[j+1]=b[j+1]+1;
}
}
for(j=0;j<4;j++)
{
a[j]=a[j]*2;
}
for(j=0;j<3;j++)
{
if(a[j]>1000000000)
{
a[j]=a[j]-1000000000;
a[j+1]=a[j+1]+1;
}
}
}
printf("ans=%09d%09d%09d%09d\n",b[3],b[2],b[1],b[0]);
}
你要理解後,寫上註解才會變成自己的東西喔。
有問題再問。
2006-10-05 10:05:26 補充:
不用陣列的作法void main(){ long a0,a1,a2,a3,b0,b1,b2,b3,i; a0=0; a1=0; a2=0; a3=0; b0=0; b1=0; b2=0; b3=0; a0=1; for(i=1;i<=100;i++) {
2006-10-05 10:05:47 補充:
a0=a0*2; a1=a1*2; a2=a2*2; a3=a3*2; if(a0>1000000000) { a0=a0-1000000000; a1++; } if(a1>1000000000) { a1=a1-1000000000; a2++; } if(a2>1000000000) { a2=a2-1000000000; a3++; }
2006-10-05 10:06:10 補充:
b0=b0+a0; b1=b1+a1; b2=b2+a2; b3=b3+a3; if(b0>1000000000) { b0=b0-1000000000; b1++; } if(b1>1000000000) { b1=b1-1000000000; b2++; } if(b2>1000000000) { b2=b2-1000000000; b3++; } } printf("ans=%09d%09d%09d%09d\n",b3,b2,b1,b0);}
2006-10-05 10:07:51 補充:
既然是作業就要理解。
2006-10-05 10:11:57 補充:
不可能出現小數的答案,用什麼浮點數?
2006-10-05 23:42:41 補充:
最下面再加上printf("ans=%09d%09d%09d%09d\n",a3,a2,a1,a0);就會秀出2的100次方的值
2006-10-05 05:56:29 · answer #2 · answered by kyiimno 3 · 0⤊ 0⤋
我是讀電子的..
至於陣列我會點皮毛,之前看書學了點
不過老師還沒上到哪耶...
除了大叔,沒其他方法?
2006-10-06 00:12:39 補充:
我%lf是用 long double
結果真的還是0.000000
float 跟double 不是用%f嗎?
天阿..中秋佳節我還要在c語言...
2006-10-06 21:41:15 補充:
我放假回家..這些都是在家打的..
家裡沒DEV-C++的程式
很感謝大大們的提供跟幫忙
我回學校會試試的
如果有問題,我會再問的
到時再請各位幫忙嚕!!
2006-10-04 21:10:55 · answer #3 · answered by Otaku Man 1 · 0⤊ 0⤋
用大數演算法
2006-10-04 11:10:18 補充:
大數演算請參考
http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/BigNumber.htm
2006-10-05 09:03:04 補充:
你之前的程式碼%d改成%lf
跑出來怎麼是-0.000000?
可能是因為你變數形式沒改
int 用%d
float and double 用%lf
2的100次方我以前做過
除了大數目前沒其他方法能計算輸出那麼大的位數
2006-10-04 04:30:49 · answer #4 · answered by Xiao Lan 4 · 0⤊ 0⤋