1 条题解

  • 2
    @ 2023-9-7 22:34:29

    难度:适中?!(不看标签『高精度』的屑甚至尝试用 long long 解题,却接连败北。。)

    考察点:高精度加法 高精度乘法 不会的遇见这种题不若弃了罢………………

    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int a[101]={0, 1};  //a:[1, 101]倒序存储单次运算结果,初始值为 1
    int b[101];  //b:[1, 101]倒序存储累计运算结果,初始值为 0
    
    int main(){
    	int n; 
    	scanf("%d", &n);
    	
    	int l=1, x=0, t=0;  //x、t:进位标记,初始值为 0  l:存储运算结果长度,初始值为 1(最高位)
    	for(int i=1; i<=n; i++){
    		for(int j=1; j<=l; j++){
    			//a[j] = a[j]*i(阶乘数据)+x(进位)
    			a[j] *= i;
    			a[j] += x;
    			
    			//进位 = a[j] 除个位以外的其余数字 
    			x = a[j]/10;
    			
    			//a[j]%10  只保留个位数字,其余进位
    			a[j] %= 10;
    			
    			if(x && j>=l){  //进位不为 0 且 j 长度不小于 l(最高位进位) 
    				l++;  //运算结果长度加 1 
    			}
    		}
    		x = 0;  //进位标记,重新赋值为 0 
    		
    		for(int j=1; j<=l; j++){
    			b[j] += a[j]+t;  //b[j] = a[j]+b[j]+t
    			t = 0;  //进位标记,重新赋值为 0
    			
    			if(b[j] > 9){  // b[j]>9:存在进位
    				t = b[j]/10;  //进位 = b[j] / 10
    				b[j] %= 10;  //删除超出存储范围的部分 
    			}
    		}
    		
    		if(t){  //加法运算进位
    			b[l+1] = t;
    			t = 0;  //进位标记,重新赋值为 0
    		}
    	}
    	
    	if(b[l+1]) printf("1");  //存在加法运算进位,输出前置 1 
    
    	for(int i=l; i>0; i--){
    		printf("%d", b[i]);  //正序输出运算结果 a
    	}
    	printf("\n");  //换行符 
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    1549
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    31
    已通过
    9
    上传者