zoukankan      html  css  js  c++  java
  • UVa 623 大整数乘法

    UVa 623

    计算N!

    n上限为1000自然不能直接算。所以可以开一个数组f[],f[]每一位存N!结果的6位。如果按进制来理解,就是10^6进制:

    例如 11!=39916800=11*10!=11*(3628800)=11*(3*(10^6)^1+628800*(10^6)^0)

    11*628800=6916800=6*(10^6)^1+916800*(10^6)^0,

    所以上式进位为6,可得 11!=(11*3+6)*(1^10)^1+916800*(10^6)^0=39916800 ,如下图

    输出时高位的前导0用printf("%06d")前面的0表示输出6位,不足6位前面补零。简直完美!

    参考代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 const int maxn = 1005;//位数
     6 int f[maxn];//上限1000!有2000+位,1005*6位足够了
     7 
     8 int main()
     9 {
    10     int n;
    11     while (cin>>n)
    12     {
    13         memset(f, 0, sizeof(f));
    14         int len = 1;//初始只有1位
    15         f[0] = 1;//1!=1
    16         for (int i = 2; i <= n; i++)//从2开始到n求阶乘
    17         {
    18             int c = 0;//表示进位
    19             for (int j = 0; j < len; j++) //模拟乘法,用每位来乘以i
    20             {
    21                 int t = f[j] * i + c;
    22                 f[j] = t % 1000000;
    23                 c = t / 1000000;
    24             }
    25             if (c) f[len++] = c;//如果进位大于0,就新增一位
    26         }
    27         cout << n << "!" << endl;
    28         cout << f[len - 1];
    29         for (int i = len - 2; i >= 0; i--)
    30             printf("%06d", f[i]);//“%06d"的0表示若f[i]不足6位前面补0 
    31         cout << endl;
    32     }
    33 }
  • 相关阅读:
    SQL compute by 的使用
    C# DES加密/解密字符串
    SET NOCOUNT { ON | OFF }
    SQL Server游标的使用 转
    SQL优化的一些总结
    精确获取时间(QueryPerformanceCounter)测试程序效率
    ajax的使用原理
    jq三级导航菜单可修改为二级、四级等导航菜单
    本地搭建PHP环境
    固定在屏幕底部的层
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/7326406.html
Copyright © 2011-2022 走看看