當前位置:首頁 » 服務存儲 » 如何用數組存儲大數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

如何用數組存儲大數

發布時間: 2022-07-17 15:51:51

c語言用數組存儲大型數據的演算法

/*
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]!='';++i){
bcs=10*bcs+str[i]-'0';
bcs%=9;
}
if(bcs==0){
printf("Y ");
}
else{
printf("N ");
}
}
return0;
}

Ⅹ 怎麼用數組保存一個數組裡面的多個最大值的位置

首先定義一個獲取最大值位置的數組index[7](跟目標數組targetArray[7]的長度一樣),用來存儲所有最大值的索引位置值,然後遍歷targetArray[]獲取最大值,此時先不給index[5]進行賦值存儲,拿到最大值再遍歷一次,再次比較,若比最大值大的或者與最大值相等元素,則對index[5]進行賦值存儲起來。最後便得出targetArray[5]的所有最大值位置。
附代碼:
int[] targetArray = {1,2,9,3,9,6,7};//目標數組
int max = targetArray[0];//初始化最大值
int[] index = new int[targetArray.length];//存儲目標數組所有最大值位置值
for (int i = 1; i < targetArray.length; i++){//第一次遍歷獲取目標數組最大值
if(targetArray[i] > max) {
max = targetArray[i];
}
}
for (int i = 1; i < targetArray.length; i++){//獲取到目標數組最大值後進行第二次遍歷目標數組
if(targetArray[i] >= max) {
max = targetArray[i];
index[i] = i;
}
}