『壹』 使用c語言,如何防止輸入整型數據位數為1000的數據溢出
這么長的數據基本上已經超過所有的數據類型了。
我覺得只能按照字元串處理,第一足夠大的字元串數組,然後根據進行存儲。
『貳』 為防止溢出,C語言中應該如何定義變數
分類: 電腦/網路 >> 程序設計 >> 其他編程語言
問題描述:
我求的是階乘有LONG是沒用的
解析:
給你個求階乘的小程序,只要最大結果位數不超過20000就行。這種超大規模的階乘是不能用簡單的long保存的。位數太大了。
#define M 20000 /* 最大結果位數,DOS能訪問的內存有限,最好不要超過 30000 位*/
#define N (M+5)
main()
{
int Num;
register int i,j,k,flag;
register unsigned int n,m,pc;
unsigned char str_n[5],result_0[N],result_1[N];
void fun_print_result(char *result,int flag);
int fun_mul(char *a,char *b,char *c,int flag);
printf("輸入計算其階乘的數:Num = ");
scanf("%d",&Num);
if(Num >= 100)
{
printf("\n正在進行階乘運算. . .\n");
printf("已完成 00000 的階乘,請等待. . .");
}
for (j=0;j<N;j++)
{
result_1[j] = 0; result_0[j] = 0;
}
result_1[N-1] = 1;
for(i=0;i<5;i++)
{
str_n[i] = 0;
}
n = 1;
pc = 0; flag = N-1;
while (n <= Num)
{
m = n;
k = 4;
while(m > 0)
{
str_n[k] = m%10; m /= 10; k--;
}
if (pc%2 == 0)
{
if(fun_mul (str_n,result_1,result_0,flag) != 1)
{
printf("\n\n結果溢出!當前所設置的最大結果為 %d 位 已完成 %d 的階乘",M,pc);
exit(0);
}
}
else
{
if(fun_mul (str_n,result_0,result_1,flag) != 1)
{
printf("\n\n結果溢出!當前所設置的最大結果為 %d 位 已完成 %d 的階乘",M,pc);
exit(0);
}
}
flag = flag-(4-k); /* flag 標記相乘後「可能的」第一個有效數字的標號 */
if(pc%2 == 0) /* 再處理一次使 flag 正好標記第一個有效數字的標號 */
{
if(result_0[flag] == 0) flag++;
}
else
{
if(result_1[flag] == 0) flag++;
}
n++; pc++;
if((pc)%25 == 0 && Num >= 100 && pc >= 100)
{
printf("\r已完成 %5d",pc);
}
}
if(Num >= 100) printf("\n");
if ((pc-1)%2 == 0)
{
fun_print_result (result_0,flag);
}
else
{
fun_print_result (result_1,flag);
}
}
int fun_mul(char *a,char *b,char *c,int flag) /* 相乘函數 */
{
register int i,j;
for(j=flag;j<N;j++) c[j]=0;
for(i=4;i>=0;i--)
{
if(a)
{
for (j=N-1;j>=flag;j--)
{
if(b[j])
{
c[i+j-4] += a[i]*b[j];
}
if(c[i+j-4] > 9)
{
c[i+j-5] += c[i+j-4]/10; c[i+j-4] %= 10;
}
}
}
}
if(flag < 10)
{
if (c[0] || c[1] || c[2] || c[3] || c[4]) /*** 結果溢出判斷 ***/
{
return 0;
}
}
return 1;
}
void fun_print_result(char *result,int flag) /* 輸出結果函數 */
{
int p;
printf("\n本次計算結果共有 %d 位,如下:\n\n",N-flag);
for(p=flag;p<N-1;p++)
{
printf("%d",result[p]);
if((p+1-flag)%(21*80) == 0)
{
printf("\n計算結果太長,請按任一鍵看下一屏,Esc 退出");
if(getch() == 27)
{
clrscr(); exit(0);
}
clrscr();
}
}
printf("%d",result[N-1]);
printf("\n\n[OK]");
}
『叄』 c語言中數據溢出的問題怎麼解決
需要准備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp,輸入問題基礎代碼。
『肆』 請教C語言高手,你們是如何防止數據計算溢出的
根據數據類型和計算結果范圍,選擇合適的數據類型。
另外一種方式就是對輸入數據進行限定,保證運算不會出現越界的可能。
還有一些其它復雜的計算方式,這里就不給你做介紹了
『伍』 C語言中為了避免緩沖區溢出應盡量使用哪些函數
緩沖區溢出是因為
使用了全局變數或者分配內存
然後這些東西佔用了電腦內存,一旦使用的內存太於在電腦可運行的分配內存就會產生溢出。
所以你要解決這個問題寫代碼要注意2點
1、少使用Const變數,在函數里使用變數(函數使用完變數會自動釋放)
2、分配內存後,就比如你new了一個對象,如果不使用這個對象的話就要Delete
(不同分配內存的東西,釋放方法不一樣,具體根據你分配內存的方法,網路一下就能找
到釋放方法)
『陸』 C語言中在階乘的程序中如何避免中間結果溢出
使用數組吧,數組的地址是連續的,所以你只需加個判斷就可以了,當地位溢出時,高位自動加一的操作,最後想輸出結果,那就遍歷數組的所以位數,求出來就可以了
『柒』 在c語言中如果輸入數據太大,該怎麼避免
C語言的輸入輸出比較原始,要看是如何進行輸入的:
1,從控制台輸入
這里其實輸入的都是終端的位元組流,控制位元組流就可以達到控制輸入數據的目的
2,從其他輸入設備輸入
例如,從文件讀取,那麼就要在程序里讀取合適大小的數據段,避免出現溢出的現象。
『捌』 c語言數據溢出怎麼辦
C語言的強大之處就在於他的靈活性,程序員自己把握。編譯器可以幫助預防錯誤,但有些程序會利用溢出,所以溢出不完全是錯誤的事情。
1、溢出:
數據類型超過了計算機字長的界限而出現的數據溢出;
2、溢出可能原因:
當應用程序讀取用戶數據,復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時 (假設定義數組int Array[10], 而在調用時使用Array[11] 或存放的數據超過int類型容量等), 內存緩沖區就可能會溢出.
3、溢出因素分析:
由於C/C++語言所固有的缺陷,既不檢查數組邊界,又不檢查類型可靠性,且用C/C++語言開發的程序由於目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,只要合理編碼,C/C++應用程序在執行效率上必然優於其它高級語言。然而,C/C++語言導致內存溢出問題的可能性也要大許多。
『玖』 在c語言編程中,如何避免整數運算溢出問題
C語言編譯時不會檢查數據溢出問題,需要編程者自行注意數據溢出問題。而且據我的經驗數據溢出問題會頻繁出現在初學習當中,程序寫多了就很少出現這樣的問題了。