當前位置:首頁 » 編程語言 » c語言表達大數字
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言表達大數字

發布時間: 2023-06-02 09:10:42

① 在c語言里怎麼從鍵盤輸入一個較大數字,如10^100

用字元串的方法 先用字元串輸入一個很大的數 任意然後一個個轉換成整型 附上一部分代碼int num1[1000],num2[1000];main(){ int i=0,count1=0,count2=0,len=0; char a[1000],b[1000]; scanf("%s%s",a,b); count1=strlen(a); count2=strlen(b); for(i=count1-1;i>=0;i--) num1[++num1[0]]=a[i]-'0'; for(i=count2-1;i>=0;i--) num2[++num2[0]]=b[i]-'0'; }這樣你就可以輸入 無限個0 只要定義字元串數組的時候更改一下位數就可以了請採納^ _ ^

② c語言定義超大數字類型

用不了,無法定義超大類型,只能用字元串來模擬

③ 用c語言輸出最大的數

C程序代碼如下:

解析:

1、首先定義a,b,c,max四個整型變數,並輸入a,b,c三個數;

2、定義最大值為a,if循環體還是對b和c進行循環;

3、根據循環體判斷最大的值,最後輸出結果。

(3)c語言表達大數字擴展閱讀

C語言的基本構成

數據類型

C的數據類型包括:整型、字元型、實型或浮點型(單精度和雙精度)、枚舉類型、數組類型、結構體類型、共用體類型、指針類型和空類型。

常量與變數

常量其值不可改變,符號常量名通常用大寫。

變數是以某標識符為名字,其值可以改變的量。標識符是以字母或下劃線開頭的一串由字母、數字或下劃線構成的序列,請注意第一個字元必須為字母或下劃線,否則為不合法的變數名。變數在編譯時為其分配相應存儲單元。

數組

如果一個變數名後面跟著一個有數字的中括弧,這個聲明就是數組聲明。字元串也是一種數組。它們以ASCII的NULL作為數組的結束。要特別注意的是,方括內的索引值是從0算起的。

字元串

C語言的字元串其實就是以''字元結尾的char型數組,使用字元型並不需要引用庫,但是使用字元串就需要C標准庫裡面的一些用於對字元串進行操作的函數。它們不同於字元數組。使用這些函數需要引用頭文件<string.h>。

文件輸入/輸出

在C語言中,輸入和輸出是經由標准庫中的一組函數來實現的。在ANSI C中,這些函數被定義在頭文件<stdio.h>;中。

④ c語言中怎麼處理一個特別大的數據的運算

最簡單的辦法是將大數當作字元串進行處理,也就是將大數用10進制字元數組進行表示,

然後模擬人們手工進行「豎式計算」的過程編寫其加減乘除函數。但是這樣做效率很低,

因為1024位的大數其10進制數字個數就有數百個,對於任何一種運算,都需要在兩個有

數百個元素的數組空間上做多重循環,還需要許多額外的空間存放計算的進位退位標志

及中間結果。其優點是演算法符合人們的日常習慣,易於理解。

⑤ c語言編程,任意大的數

#include <stdio.h>
#include <string.h>
typedef struct bigint
{
char *num; //指向長整數數組(序號0中保存著最低位)
char minus; //符號(1表示正數,-1表示負數)
int digit; //保存該數的位數(實際位數)
}BIGINT, *pBIGINT;
void BigIntTrans(pBIGINT num); //字元串轉數字
void BigIntMul(pBIGINT num1, pBIGINT num2, pBIGINT result); //乘法函數
void BigIntAdd1(pBIGINT num1, pBIGINT num2, pBIGINT result); //同號數相加
void BigIntAdd(pBIGINT num1, pBIGINT num2, pBIGINT result); //加法函數
void BigIntSub1(pBIGINT num1, pBIGINT num2, pBIGINT result); //異號相減函數
void BigIntSub(pBIGINT num1, pBIGINT num2, pBIGINT result); //減法函數
void BigIntDiv(pBIGINT num1, pBIGINT num2, pBIGINT result, pBIGINT resie); //除法函數
void BigIntPrint(pBIGINT result); //輸出大整數
int BigIntEqual(pBIGINT num1, pBIGINT num2); //兩數大小比較

void BigIntTrim(pBIGINT num1) //整理大整數,去掉前面多餘的0,並使調整其位數
{
int i;
for (i = num1->digit - 1; i >= 0; i--)
{
if (num1->num[i] != 0)
break;
}
if (i < 0) //若余數全部為0
{
num1->digit = 1; //設置余數位數為1
num1->num[0] = 0;
} else
num1->digit = i + 1; //余數位數
}
void BigIntTrans(pBIGINT num1) //將字元串轉為數字表示
{
char *temp; //臨時數組
int i, k, len;
len = strlen(num1->num); //字元串長度
if (!(temp = (char *) malloc(sizeof(char) * len))) //分配內存
{
printf("內存分配失敗!\n");
exit(0);
}
i = 0;
num1->minus = 1; //保存為正數
if (num1->num[0] == '-') //判斷是否為負數
{
num1->minus = -1; //保存為負數
i++;
}
k = 0; //數字位數計數器
while (num1->num[i] != '\0') //字元串未結束
{
if (num1->num[i] >= '0' && num1->num[i] <= '9') //為數字0~9
{
temp[k] = num1->num[i] - '0'; //將ASCII碼轉換為對應數字
k++;
}
i++;
}

for (i = 0; i < num1->digit; i++) //清空數組各元素
num1->num[i] = 0;
num1->digit = k; //轉換後的數據位數
for (i = 0, k--; k >= 0; k--, i++) //將臨時數組各位反置保存到數組num中
num1->num[i] = temp[k];
BigIntTrim(num1); //整理輸入的大整數
}
void BigIntPrint(pBIGINT result) //輸出大整數
{
int j;
if (result->minus == -1) //是負數
printf("-"); //輸出負數
if (result->digit == 1 && result->num[0] == 0) //若大整數為0
printf("0");
else //不為0
{
for (j = result->digit - 1; j >= 0; j--) //從高位到低位輸出
printf("%d", result->num[j]);
}
}
int BigIntEqual(pBIGINT num1, pBIGINT num2) //比較絕對值大小
{
int i;
if (num1->digit > num2->digit) //num1的位數大於num2
return 1;
else if (num1->digit < num2->digit) //num1的位數小於num2
return -1;
else //兩數位數相等
{
i = num1->digit - 1; //num1的數據位數
while (i >= 0) //從高位向低位比
{
if (num1->num[i] > num2->num[i]) //num1對應位大於num2
return 1;
else if (num1->num[i] < num2->num[i]) //num1對應位小於num2
return -1;
else
i--; //比較下一位
}
}
return 0; //相等
}
void BigIntAdd(pBIGINT num1, pBIGINT num2, pBIGINT result)
{
int i;
i = BigIntEqual(num1, num2); //比較兩數絕對值大小
if (i < 0) //num1絕對值小於num2
{
pBIGINT temp;
temp = num1; //交換兩數
num1 = num2;
num2 = temp;
}
if (num1->minus * num2->minus < 0) //符號不同,則執減法
{
if (i == 0) //兩數相等
{
result->digit = 1; //結果長度為一位數,就是數值0
result->num[0] = 0; //結果值為0
result->minus = 1; //結果設為正號
return; //返回
}
BigIntSub1(num1, num2, result); //調用相減函數完成異號相加的情況
} else
BigIntAdd1(num1, num2, result); //調用相加函數完成同號相加
}
void BigIntAdd1(pBIGINT num1, pBIGINT num2, pBIGINT result)
{
int i, carry;
carry = 0;
result->minus = num1->minus; //保存符號
for (i = 0; i < num1->digit; i++) //將被加數復制到結果數組中
result->num[i] = num1->num[i];
for (i = 0; i < num2->digit; i++) //num2中的數小,可能位數也小些
{
result->num[i] = result->num[i] + num2->num[i] + carry; //將對應位的數和進位數相加
carry = result->num[i] / 10; //計算進位數據
result->num[i] = result->num[i] % 10; //保留一位
}
if (carry) //若最後還有進位
result->num[i] = result->num[i] + carry;
BigIntTrim(result); //整理結果
}
void BigIntSub1(pBIGINT num1, pBIGINT num2, pBIGINT result) //異號相減函數
{
int i, borrow;
result->minus = num1->minus; //因num1絕對值比num2大,結果符號與num1相同
borrow = 0;
for (i = 0; i < num1->digit; i++) //將被減數的內容復制到結果中
result->num[i] = num1->num[i];
for (i = 0; i <= num2->digit; i++)
{
result->num[i] = result->num[i] - num2->num[i] - borrow; //num1減去num2,並減去低位的借位
if (result->num[i] < 0) //若為負數
{
result->num[i] = 10 + result->num[i]; //向高位借位
borrow = 1; //設置借位值
} else
borrow = 0;
}
if (borrow == 1)
result->num[i] = result->num[i] - borrow;
BigIntTrim(result);
/*i = num1->digit;
while (i > 0)
{
if (result->num[i] == 0)
i--;
else
break;
}
result->digit = i; //保存結果位數*/
}
void BigIntSub(pBIGINT num1, pBIGINT num2, pBIGINT result) //減法函數
{
num2->minus = -1 * num2->minus; //將減數的符號取反
BigIntAdd(num1, num2, result); //調用加法函數
}
void BigIntMul(pBIGINT num1, pBIGINT num2, pBIGINT result)
{
char carry, temp;
int i, j, pos;
for (i = 0; i < num1->digit + num2->digit; i++) //結果數組和中間數組清0
result->num[i] = 0;
for (i = 0; i < num2->digit; i++) //用乘數的每1位乘以被乘數
{
carry = 0; //清除進位
for (j = 0; j < num1->digit; j++) //被乘數的每1位
{
temp = num2->num[i] * num1->num[j] + carry; //相乘並加上進位
carry = temp / 10; //計算進位carry
temp = temp % 10; //計算當前位的值
pos = i + j;
result->num[pos] += temp; //計算結果累加到臨時數組中
carry = carry + result->num[pos] / 10; //計算進位
result->num[pos] = result->num[pos] % 10;
}
if (carry > 0)
{
result->num[i + j] = carry; //加上最高位進位
result->digit = i + j + 1; //保存結果位數
} else
result->digit = i + j; //保存結果位數
}
result->minus = num1->minus * num2->minus; //結果的符號
}
void BigIntDiv(pBIGINT num1, pBIGINT num2, pBIGINT result, pBIGINT resie) //除法函數函數 》?躒サ臀壞慕櫛?雗um1相同 數
{
BIGINT quo1, resio1, quo2;
int i, j, k, m; //k保存試商結果,m保存商的位數
char t;
result->minus = num1->minus * num2->minus; //商的符號
resie->num = (char *) malloc(sizeof(char) * num2->digit); //分配余數的內存空間
resie->digit = num2->digit+1; //設置余數的初始位數與除數相同
for (i = 0; i < resie->digit; i++) //將余數全部清0
resie->num[i] = 0;
m = 0;
for (i = num1->digit - 1; i >= 0; i--)
{
resie->digit=num2->digit+1; //重新設置余數的位數比除數多一位
for (j = resie->digit - 1; j > 0; j--) //移余數
resie->num[j] = resie->num[j - 1]; //將序號低位的數據移向高位(實際是將余數中的最高位去除)
resie->num[0] = num1->num[i]; //復制被除數中的一位到余數的最低位中
BigIntTrim(resie);//整理余數
k = 0; //試商
while (BigIntEqual(resie, num2) >= 0) //比較余數與除數的大小
{
BigIntSub1(resie, num2, resie); //用余數減去除數,差值保存在余數中
k++; //試商加1
}
result->num[m++] = k; //保存商
}
result->digit = m; //保存商的位數
for (i = 0; i < m / 2; i++) //將商各位反轉(在計算過程中序號0保存的是商的高位)
{
t = result->num[i];
result->num[i] = result->num[m - 1 - i];
result->num[m - 1 - i] = t;
}
BigIntTrim(result); //整理商
BigIntTrim(resie); //整理余數
}
int main()
{
BIGINT num1, num2, result, resie; //參與運算的數、結果、余數
int i = 0, len;
char op;
printf("輸入最大數的位數:");
scanf("%d", &len);
if (!(num1.num = (char *) malloc(sizeof(char) * (len + 1))))
{
printf("內存分配失敗!\n");
exit(0);
}
num1.digit = len + 1;
if (!(num2.num = (char *) malloc(sizeof(char) * (len + 1))))
{
printf("內存分配失敗!\n");
exit(0);
}
num2.digit = len + 1;
if (!(result.num = (char *) malloc(sizeof(char) * (2 * len + 1))))
{
printf("內存分配失敗!\n");
exit(0);
}
result.digit = 2 * len + 1;
for (i = 0; i < result.digit; i++) //清空結果集
result.num[i] = 0;
printf("選擇大整數的運算(+、-、*、/):");
fflush(stdin);
scanf("%c", &op);
switch (op)
{
case '+':
printf("\n輸入被加數:");
scanf("%s", num1.num);
printf("\n輸入加數:");
scanf("%s", num2.num);
BigIntTrans(&num1);
BigIntTrans(&num2);
BigIntAdd(&num1, &num2, &result); //加法
break;
case '-':
printf("\n輸入被減數:");
scanf("%s", num1.num);
printf("\n輸入減數:");
scanf("%s", num2.num);
BigIntTrans(&num1);
BigIntTrans(&num2);
BigIntSub(&num1, &num2, &result); //減法
break;
case '*':
printf("\n輸入被乘數:");
scanf("%s", num1.num);
printf("\n輸入乘數:");
scanf("%s", num2.num);
BigIntTrans(&num1);
BigIntTrans(&num2);
BigIntMul(&num1, &num2, &result); //乘法
break;
case '/':
printf("\n輸入被除數:");
scanf("%s", num1.num);
printf("\n輸入除數:");
scanf("%s", num2.num);
BigIntTrans(&num1);
BigIntTrans(&num2);
if (num2.digit == 1 && num2.num[0] == 0) //大整數為0
printf("除數不能為0!\n");
else
BigIntDiv(&num1, &num2, &result, &resie); //除法法
break;
}
if (op == '/')
{
if (!(num2.digit == 1 && num2.num[0] == 0)) //為除法且除數不為0
{
printf("商:");
BigIntPrint(&result);
printf("\t余數:");
BigIntPrint(&resie);
}
} else
{
printf("\n結果:");
BigIntPrint(&result);
}

getch();
return 0;
}

⑥ C語言中怎樣表示大整數

long long是最大的,應該可以表示幾十位把
是在不行,就用數組來做,這個可以做相應的加減乘除子函數

⑦ c語言中怎樣輸入一個很大的整數

可以利用字元數組來存放整數的各位數值,即將整數當成一串字元來輸入。

如果要輸入12345678901234567890,則定義一個char型數組a[20],將用戶輸入的整數當成一串字元存入字元數組a中。


具體實現方法可以參考如下程序段:

chara[20];
scanf("%s",a);//輸入12345678901234567890,即可將該整數輸入到字元數組a當中
//則數組a中各元素值為a[0]='1',a[1]='2',a[2]='3',.......,a[19]='0'
//在進行運算的時候將字元轉換為數字即可(即a[i]-'0')