English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

我是大一新生,計概有一項作業
題目: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

4 個解答

用 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 有些 compiler 要加參數 -lm

2006-10-05 18:27:17 補充:
若不管誤差,這程式只要#include #include int main(){ printf("%f", (power(2,101)-1) / (2-1)); return 0;}就可以了。(power(2,101)-1) / (2-1) 當然還可以再簡為power(2,101)-1,當然, -1 已經沒用了。

2006-10-05 18:59:51 補充:
若要精準,要用多個整數去做。標準做法是用陣列:#include #include #define N 1000000000Lint main(){ long a[4]; int i, j; for (i=1; i<4; i++) a[i] = 0; a[0] = 2; // 已偷算一次方 for (i=0; i<100; i++) // 算到 101 次 {for (j=0; j<4; j++) a[j] <<= 1; for (j=0; j<4; j++) if (a[j] > N)

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

fedest.com, questions and answers