1樓:延澈左
c語言中的任何數值型別都是有一定的取值範圍。
型別識別符號型別說明位元組長度取值範圍
char字元型1-(2^7)~(2^7-1)
unsigned char無符號字元型10 ~ (2^8-1)
short int短整型2-(2^15)~(2^15-1)
unsigned short int無符號短整型20 ~ (2^16-1)
int整型4-(2^31)~(2^31-1)
unsigned int無符號整型40 ~ (2^32-1)
float實型(單精密度)4
double實型(雙精密度)8
long double實型(長雙精密度)10
顯然,如果要處理乙個很大很大的數,好比有1000位,則這些數值型別肯定都不能用。這就是經典的大數處理問題。
大數處理有許多方法,此刻我也只是處於剛開始學階段,乙個想法就是把數字看成是字元,哄騙記憶體動態分配和字串來處理大數。這個方法比較直**,但效率不高。
實現兩個大數的相加:
1、自定義乙個大數相加的函式庫:
bignumadd.h
/* 把數字看成字元,從而獲取數字作為字元型陣列的元素 */
char *numadd(char *a, char *b);
bignumadd.c
#include
#include
/* 我們的習慣都是從個位數開始相加 */
/* 當把數字看成字串時,根據輸入順序,字元陣列元素c[0]是最高位,c[num-1]才是個位數 */
/* 為了和習慣相同,而且對於兩個數字的位數不同時,更有必要把陣列元素的順序反置,使c[0]是個位數,這樣才方便逐位相加 */
/* 把乙個字元陣列cbegin裡的元素按相反順序放置得到新的字元陣列clast */
char *reverse(char *cbegin)
/* 加法最重要的就是確定進製 */
/* 好比(7 8)=15,則5 = (7 8)應該就是和sum在該位的值,1 = (7 8)/10則是孕育發生的進製 */
char *numadd(char *a, char *b)/* 兩個字元陣列的元素逐一相加 */
if(*pb)
*ps = s '0';/* 確定sum在在該位上的值,並把數字轉換成字元 */
ps ;
s /= 10;/* 確定進製 */
}if(s)/* 最高位是不是有進製 */
*ps= '\0';
return reverse(sum);
}2、對兩個大數相加(挪用自定義的庫函式)
/********************************
* 讓兩個大數相加;
* 任何數值型別都是有一定範圍的;
* 對於兩個很大的數相加;
* 則應把數字看成字元;
* 哄騙動態分配記憶體的方式處理;
* *****************************/
#include
#include
#include
#include "bignum.h"
char *getnum();
int main()
char *getnum()/* 把輸入的數字看成是字元,存入字元陣列 */
*(num2 len-1) = c;/* 陣列元素從0開始 */
*(num2 len) = '\0';
num1 = num2;
}return num1;
}擺平!!!
2樓:半夢的看書亼
去掉最後乙個優化
用計算機組成原理上的原始方法,用陣列模擬bit位,模擬加法器執行
如果你沒學過計算機組成原理,就無視此題吧
3樓:匿名使用者
不知道c語言的位移運算能不能解決這個問題,我也一直在想,可是都沒有做出來。
求助!!!c語言漢諾塔問題 樣例已經通過,但是過不了oj 實在找不出原因 故求助各位前輩大神!
4樓:物理公司的
#include
int main()
{int n,p,q,i,j,flag;
int a[4][65];
scanf("%d",&n);
while(n--)
{flag=1;
scanf("%d%d",&p,&q);
for(i=1;i<=p;++i)
a[1][i]=p-i+1;
a[1][0]=p;
a[2][0]=0;
a[3][0]=0;
while(q--)
{scanf("%d%d",&i,&j);
if(a[i][a[i][0]]&&(a[j][a[j][0]]==0||a[i][a[i][0]]
C語言微控制器程式求助
void main 這種方法原理簡單易行,缺點是精度比定時器稍低,注意不要使x y溢位。我們還可以對上面的程式優化 void main 用計數器做!和中斷 中斷設定成 邊沿觸發中斷 在中斷的同時開啟計數器,並判斷是此時高電平還是低電平,然後等到下乙個中斷到來,將計數器的內容另存,然後清空重新計數 這...
c語言新手求助,C語言程式設計 新手求助
因為 中用錯了輸出控制符,應該將printf f n num 中的 f改成 d才是。此程式中,已定義num為整型變數,而在後面的printf 輸出時,型別被描述為浮點數 f 這樣寫法是有問題的。c語言中,整型變數和浮點型變數在記憶體中的存放格式是不一樣的。整型變數表示的是乙個16位長的二進位制數,在...
C語言問題,C語言問題,求助
while語句的執行順序 1.判斷x的值 非0為真,0為假 2.執行 3.執行 裡面的 這裡是空,所以沒任何動作。所以會一直迴圈到x 0,判定為假,迴圈終止。接著執行減減,最後列印結果為 1 c語言問題,求助 這題是迷惑人用的.因為迴圈內部沒有break,所以for會一直執行下去,直到a 11,這時...