用高精度計算出s=1!+2!+3!+…+n!(n≤50)s=1!+2!+3!+…+n! (n≤50)s=1!+2!+3!+…+n!(n≤50)
其中「!」表示階乘,例如:5!=5×4×3×2×15!=5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。
乙個正整數nnn。
乙個正整數sss,表示計算結果。
輸入 #1
3輸出 #1
9題意很簡單就是輸入乙個數計算從1到這個數的階乘之和。即1!+2!+3!+.......+n!
先算出每個數的階乘,再將其累加到乙個陣列上即可。
剛開始沒有看清題意就開始寫了,我就只算了n!,沒有進行累加。原來這題是大數加加大數乘,唉,大意了。
下面是**分為有注釋和無注釋的,因為有注釋的有點亂所以整理乙個簡潔版
#include#include#includeint a[100000];
int b[100000];
int c[200000];
int sum[30000];
int factorial(int m,int n)
// for(int i=0;i0) //從後往前找第乙個不為0的數的位置,注意至少有一,畢竟0也是一位數
k--;
for(int i=0;i<=k;i++) //為了下次相乘,將相乘的結果儲存到b陣列中
b[i]=c[i];
for(int i=0;i<=k;i++) //將結果陣列清0,不然下次無法計算
c[i]=0;
// printf("%d*\n",k);
return k+1; //返回結果陣列的長度
}int add(int m,int n) //兩個字串累加函式
} else
} if(sum[i+1]!=0) return i+1; //返回相加後的陣列的長度。
else return i;
} int main()
// printf("%d %d**\n",m,n);
// for(x=0;x=0;i--)
// printf("%d",b[i]);
// printf("\n");
// printf("\n");
for(i=y-1;i>=0;i--) //輸出結果
printf("%d",sum[i]);
return 0;
}
#include#include#includeint a[100000],b[100000],c[200000],sum[30000];
int factorial(int m,int n)
int k=m+n;
while(c[k]==0 && k>0)
k--;
for(int i=0;i<=k;i++)
b[i]=c[i];
for(int i=0;i<=k;i++)
c[i]=0;
return k+1;
}int add(int m,int n)
} else
} if(sum[i+1]!=0) return i+1;
else return i;
} int main()
x=factorial(m,x);
y=add(x,y);
} for(i=y-1;i>=0;i--)
printf("%d",sum[i]);
return 0;
}
階乘之和 大數乘法和大數加法
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 用高精度計算出s 1!2!3!n!n 50 其中 表示階乘,例如 5!54321。輸入正整數n 輸出計算結果s 輸入 3輸出 9利用數學方式計算大數。牛客...
洛谷 階乘數碼 階乘之和
題目描述求n 中某個數碼出現的次數。輸入格式 第一行為t 10 表示資料組數。接下來t行,每行乙個正整數n 1000 和數碼a。輸出格式 對於每組資料,輸出乙個整數,表示n 中a出現的次數。輸入樣例 1 2 5 27 0 輸出樣例 1 1 2 直接高精階乘 include include inclu...
P1009 階乘之和(大數計算)
allsight c語言 高精度加法 問題描述 輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。演算法描述 由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a 0 用於儲存a的個位,a 1 用於儲存a的十位,依此類推。...