← 返回文章流

蓝桥杯 基础练习 阶乘计算

问题描述 输入一个正整数n,输出n!的值。 其中n!=1*2*3*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。 输入格式 输入包含一个正整数n,n<=1000。 输出格式 输出n!的准确值。 样例输入 10 样例输出 3628800 C++算法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #include <stdio.h> #include <string.h> #define MAX 10000 #define mod 10000 #define baselen 4 #define in(a) scanf("%d",&a) #define out1(a) printf("%d",a) #define out2(a) printf("%04d",a) typedef int type; struct bint{ type dig[MAX], len; bint(){len = 0, dig[0] = 0;} }; void by(bint a, type b, bint& c){ type i, carry; for( i = carry = 0; i <= a.len || carry; i++){ if( i <= a.len ) carry += b*a.dig[i]; c.dig[i] = carry%mod; carry /= mod; } i--; while( i && !c.dig[i] )i--; c.len = i; } bool input(bint& a){ type i, j, w, k, p; char data[MAX*baselen+1]; if(scanf("%s",data)==EOF)return false; w = strlen(data) - 1, a.len = 0; for(p=0;p<=w&&data[p]=='0';p++); while(1){ i = j = 0, k = 1; while(i<baselen&&w>=p){ j = j+ (data[w--] - '0')*k; k *= 10, i++; } a.dig[a.len++] = j; if(w<p)break; } a.len--; return true; } void output(bint& a){ type i; i = a.len - 1; out1(a.dig[a.len]); while(i>=0)out2(a.dig[i--]); } void give(type a, bint& b){ b.dig[0] = a%mod; a /= mod; if(a>0)b.dig[1] = a, b.len = 1; else b.len = 0; } int main() { bint a;int b,i;scanf("%d",&b);give(1,a); for(i=2;i<=b;i++)by(a,i,a); output(a);printf("\n"); return 0; } 关注微信公众号,第一时间获取最新内容,让我们一起变得更强!Debug客栈:订阅本站· 文章归档· 我的项目· 友情链接· 我的使用· 飞湾计划· 摄影展集· 我的主页· 知盈官网

来自 Debug客栈作者主页
在原博客阅读全文 (新标签页打开)

以上内容来自博客订阅源,版权归原作者。关注作者后可以在 关注列表 第一时间查看作者文章。

一起聊聊 0

尊重不同观点

还没有评论。欢迎分享第一个想法。

RSS SUBSCRIPTIONS

选择 RSS 订阅

把博客汇的文章添加到你常用的阅读器。

关注文章 RSS 订阅本订阅需要登录后使用