平方和階乘(乙個繁瑣的高精 C )

2021-08-26 20:33:52 字數 2838 閱讀 1582

平方和階乘

題目限制

時間限制 1000ms 記憶體限制 1000kib

題目描述 description

小明是乙個數學渣渣,但是老師總是讓他做一些很奇怪的題目。

這次小明又遇到麻煩了,老師告訴他乙個數a,讓他求出這個數平方的階乘a1和這個數階乘的平方a2,還要a1a2的和,和a1a2的非負數差;

在a很小的時候,小明勉強能死算出答案;但是a很大的時候,小明就崩潰了。

請你為小明編乙個程式解決這個問題。

輸入描述 input description

輸入乙個正整數a。(1<=a<=250)

輸出描述 output description

第一行輸出a平方的階乘a1。

第二行輸出a階乘的平方a2。

第三行輸出a1+a2的值。

第四行輸出a1-a2的絕對值。

樣例輸入 sample input

3
樣例輸出 sample output

362880

36362916

362844

資料範圍及提示 data size & hint

1<=a<=250;

資料大到不可想象,務必使用高精。(不用可能1個測試點也不過)

a1=(aa)!;a2=(a!)(a!);

思路點拔:由於本題資料很大,所以我們需要使用高精度進行求解,首先計算平方的階乘,由於a的平方沒有爆,所以我們就用乙個int型別的變數儲存a的平方的值,然後,我們就使用高精乘以低精的做法,然後我們那另乙個陣列把這個階乘的結果複製乙份,然後就使用純粹的高精乘,然後就用乙個高精加和乙個高精減就可以了,唯一要強調的就是:陣列開得有點多,所以不要搞混淆了。

上**!!

#include

#include

#include

using

namespace

std;

int a[1000005]=,x,w=1,b[1000005]=,c[1000005],d[2000005],e[1000005],f[1000005];

char a1[100005],d1[100005];

int main()

//計算

while(x) //處理進製

}for(int i=w;i>=1;i--) printf("%d",a[i]); //輸出平方的階乘的結果

printf("\n");

int lena=w; //儲存結果的長度,便於一會使用

w=1; //將位數重新變為1

for(int i=2;i<=n;i++) //首先計算n的階乘,由於n<=250,所以也需要使用高精度

//計算

while(x>0)//處理進製

}for(int i=1;i<=w;i++) c[i]=b[i]; //複製乙份,以便下面使用

for(int i=1;i<=w;i++)

d[i+w]=x; //處理最高位的進製

}int lenc=2*w;

while(d[lenc]==0&&lenc>1) lenc--; //去除前導0

for(int i=lenc;i>=1;i--) printf("%d",d[i]); //輸出平方的階乘的結果

printf("\n");

int lenb=lenc,lend=1; //lenb用來儲存長度,lend用來儲存和的長度

x=0;

while(lend<=lena||lend<=lenb) //高精加

e[lend]=x; //處理最高位

while(e[lend]==0&&lend>1) lend--; //去除前導0

for(int i=lend;i>=1;i--) printf("%d",e[i]);

//輸出平方的階乘與結成的額平方的和

printf("\n");

for(int i=1;i<=lena;i++) a1[i]=a[i]+'0';

//將它們先轉化為字串,一會好使用函式,更方便一些

for(int i=1;i<=lenb;i++) d1[i]=d[i]+'0';

if(lenastrcmp(a1,d1)<0))

//比較兩個數的大小,如果前乙個數小於後乙個數

for(int i=1;i<=lena;i++) a[i]=a1[i]-'0';

//然後將它們重新轉化為整形,方便下面計算

for(int j=1;j<=lenb;j++) d[j]=d1[j]-'0';

int i=1; //i用來儲存結果的位數

while(i<=lena)

//處理借位

f[i]=a[i]-d[i];//計算

i++;

}while(f[i]==0&&i>1) i--; //去除前導0

int lenans=i;

//由於i是定義在外面的,所以和for迴圈裡面的i不影響,但是輸出是就有問題了

for(int i=lenans;i>=1;i--) printf("%d",f[i]); //輸出

return0;}

/*大家會發現這些**很繁瑣,就是出現了一些很相似的地方,大家就像寫幾個子函式

但是我覺得呼叫函式需要時間,所以我覺得這樣寫執行時間短,但是寫函式在本題也不

會超時,所以有興趣的可以自己試一下,我就不上**了 ^_^*/

C 利用遞迴求乙個數的階乘 遞迴 階乘

當然也可以用迭代 就是迴圈 來求階乘,遞迴適用於選擇結構,迭代適用於迴圈結構。能用遞迴解決的問題,一定能用迭代來解決。c 利用遞迴求乙個數的階乘 遞迴 即自己呼叫自己 分類 分為直接呼叫和間接呼叫 直接呼叫 不通過其他函式直接在本函式內,呼叫自己。間接呼叫 通過多步操作,在其他函式內呼叫本身。inc...

輸入乙個菱形的內高和外高,畫出乙個空心菱形

歡迎交流,共同進步。題目為 已知內層和外層菱形的高度,輸出一空心菱形 使用自己的語言描述 使用c語言畫出乙個菱形,輸入上三角高內層菱形為l1,外高為l2,輸入需要保證數值為正整數,且為奇數。此處我理解菱形為對角線相等的菱形 看了題目後編寫如下,設計思路為從 菱形中扣 菱形,寫的時候遇到很多思路不清晰...

乙個高ai的分頁函式和乙個url函式

aidu ad 這個分頁 函式非常高只能的 看看就知道了 function ppage total,page,e page 15,e block 10,url color totalpage ceil total e page 頁面數目 p block ceil totalpage e block ...