/*
size_a,pa——指向數組a的有效末端
ma——a的最大容量,必須大於na
n=12——求n的階
p——求階乘時的當前乘數
*/
#include<stdio.h>
#define Ma 10000
int pa;/*指向數組a的有效末端*/
int p=2;
int memory_over=0;
union data
{ unsigned long int b;
struct
{unsigned l:16;
unsigned h:16;
}m;
}a[Ma];
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
演算法說明1:考慮到result比較長,我用a[Ma].b來存儲n!的result,每一位a[pa].b能存儲4位10進制數字。
因為我定義的數組是靜態的,所以Ma應該足夠大。
ps:其實只用定義一個unsigned long int b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考慮到可能會訪問每一結點b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考慮是多餘的!!不用像我這樣定義這么復雜的共用體!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned int cashe;
unsigned int carry;
void main()
{
unsigned int n;/*求n的階*/
void facto(unsigned int n);
printf("Input n:");
scanf("%u",&n);
/*=================開始求階乘!=============*/
a[0].b=1;/*初始化*/
facto(n);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
演算法說明2:上面這句直接調用facto(n)來求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*========================以下是顯示最後結果====================================*/
if(memory_over==0)
{printf("the result include %dNO:\n",pa+1);
printf("%u",a[pa--].m.l);
for(;pa>=0;pa--)
printf("%04u",a[pa].m.l);
printf("\n");
}
getch();
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
演算法說明2:求階函數facto(n)說明:
這個函數會不斷地調用multiple(),它的作用是每被調用一次就使得a[pa].b與階數p相乘一次,直到乘完n為止!
{multiple();
p++;/*每一輪乘一個階數p*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void facto(unsigned int n)
{void multiple();
pa=0;
while(pa<Ma-1&&p<=n)/*容量限制*/
{multiple();
p++;/*每一輪乘一個階數p*/
}
if(p<=n)
{printf("memory out!\n");memory_over=1;}/*如果當前的存儲結果的數組a[Ma]不夠用!應提高Ma*/
}
/*==============================================================================
演算法說明3:乘法函數multiple()說明:負責a[pa].b與階數p相乘。
a[pa].b有很多結點,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。
當然是從低結點a[0].b開始不斷與p相乘,產生的「進位」加到高位a[1].b,直到a[pa].b*p為止!
隨著結果數值增大,pa個結點的a[].b可能容納不下結果,所以如果a[pa].b與p相乘後還有「進位」carry,就擴大pa,並把carry放入到新增加的結點:
if(carry>0)
a[++pa].b=carry;
===================================================================================*/
void multiple()
{int i=0;
carry=0;
while(i<=pa)/*i指向當前處理的元素a[i],每一輪用一個位與階數p相乘*/
{a[i].b=a[i].b*p+carry;/*計算結果,要考慮來自低位的進位*/
carry=a[i].b/10000;/*計算進位*/
a[i].b=a[i].b%10000;/*計算余數*/
i++;
}
if(carry>0)
a[++pa].b=carry;
}
Ⅱ c語言中超大數如何存儲
用數組,比如魔方的排列狀態可以用個 unsigned long a[4]來存起來。
Ⅲ 數組存儲大數字
/*給你改好了,就一個很小的地方,估計是筆誤了,29的時候錯了, 估計就是29的時候某一位=10, 結果沒往前進位導致的, 改動在代碼里注釋了*/
#include<stdio.h>
main()
{
int data[4000]={1,1}; //既然是大數階乘, 這個數組最好大些
int digit=1;
int i,j,k,r;
int n;
printf("請輸入階乘的最大數字\n");
scanf("%d",&n);
for(i=1;i<=n;i++)//依次乘積
{
for(j=1;j<=digit;j++)
data[j]*=i;
for(j=1;j<=digit;j++)
{
if(data[j]>=10)
{
for(r=1;r<=digit;r++)
{
if(data[digit]>=10) //這里是>=10
digit++;//滿十進位
data[r+1]+=data[r]/10;
data[r]=data[r]%10;
}
}
}
printf("%d!=",i);
for(k=digit;k>0;k--)
printf("%d",data[k]);
printf("\n");
}
}
Ⅳ 怎樣用數組表示大數,
用數組表示大數就是:數組內的每一個成員只表示大數里的一位。
如數組int
a[100]表示:123456789
a[0]為符號位,值為1時為正數,值為-1為負數(值可以自己定義)
a[1]=1;
a[2]=2;
a[3]=3;~~~;a[9]=9;
最後定義一個結束位a[10]=-999;(-999是結束的標志,可以自己定義)
如果要用大數進行運算則要重寫四則運演算法則。
重寫加減法較為簡單,乘除法則較為復雜,需要花大量時間設計。
一般來說存儲使用字元串數組如:char
a[100],運算時則轉化為
數值數組:int
a[100]。[]中的100為數組長度,大數長度必須在100-2的范圍內
才能正確表示。數組長度由自己定義。
Ⅳ C語言如何存放大數(超過500位的) 越詳細越好
超過500位的話,就必須用到高精度!
比如輸入 一個數字 123
那麼我們就用一個數組 a[501]={1,2,3};
如果是鍵盤輸入:
scanf("%d",&n);//大數的位數
for(i=1;i<=n;i++) scanf("%1d",&a[i]);//讀入每一位
這樣就可以了!
Ⅵ 怎麼用數組存儲一個大數,求教
C語言的系統類型,均有大小的限制。超出這個存儲范圍,就無法用該類型進行存儲。
所以需要根據數據規模,來選擇存儲類型。
當需要存儲的數很大很大,超出所有可以類型可以表示的范圍時,比如一個100位的10進制數,就需要用字元串的方式進行存儲。這種存儲方式,在演算法中稱為大數存儲,對這種大數的計算,稱為大數計算。
以下是一個輸入最多不超過1000位的10進制數,並將其輸出的代碼:
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
char s[1001];
scanf("%s",s);//輸入數據
printf("%s\n",s);//輸出讀取到的大數。
return 0;
}
Ⅶ c語言中怎麼存儲一個很大很大的數
C語言的系統類型,均有大小的限制。超出這個存儲范圍,就無法用該類型進行存儲。所以需要根據數據規模,來選擇存儲類型。
當需要存儲的數很大很大,超出所有可以類型可以表示的范圍時,比如一個100位的10進制數,就需要用字元串的方式進行存儲。這種存儲方式,在演算法中稱為大數存儲,對這種大數的計算,稱為大數計算。
(7)如何用數組存儲大數擴展閱讀:
順序結構:
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
例如:a = 3,b = 5,現交換a,b的值,這個問題就好像交換兩個杯子裡面的水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正確的程序為:c = a; a = b; b = c;執行結果是a = 5,b = c = 3如果改變其順序。
寫成:a = b; c = a; b =c;則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算、輸出三步曲的程序就是順序結構。
例如計算圓的面積,其程序的語句順序就是輸入圓的半徑r,計算s = 3.14159*r*r,輸出圓的面積s。不過大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的復合語句、循環結構中的循環體等。
Ⅷ C++中如何用數組來表示一個很大的數
額,你就把在x[N]的第一個數存0或者1表示該數的符號,後面如果你不想節約空間的話,你就數組的每一位對應存一個數位。x[1]=1,x[2]=2,x[3]=3,x[4]=8
就可以表示1238這個數了。當然你若覺得這樣浪費空間,你可以數組的每一位存幾個數:x[1]=123,x[2]=234,x[3]=768,那就表示123234768.
Ⅸ C語言數組存儲超大整數
模擬整數除法即可:
#include<stdio.h>
intmain()
{
charstr[101];
intn,i,bcs;
scanf("%d",&n);
getchar();
while(n--){
scanf("%s",str);
bcs=0;
for(i=0;str[i]!='