• 杭电1042


    题意:计算N!(0<N<=10000)

    Analyse:
    大数乘小数问题。还是用比较原始的模拟。这道题调试了好一段时间,真受不鸟,高人指点才发现是个低级错误,d的值没有先用temp储存而错了。

    View Code
     1 #include<stdio.h>
    2 #define UNIT 100000
    3 typedef struct
    4 {
    5 __int64 key[10000];//每个key存五位
    6 int digit;//每个key算作一个digit
    7 }bigint;
    8 main()
    9 {
    10 bigint carry;//用来保存相乘后的进位
    11 bigint num;//每次大数相乘的结果
    12 int n;
    13 __int64 d,temp;//d为大数相加的进位
    14 int i,j;//j为大数key的索引,i为因数
    15
    16 while(scanf("%d",&n)!=EOF)
    17 {
    18 num.key[0]=1;
    19 num.digit=1;
    20 for(i=1;i<=n;i++)
    21 {
    22 //设定carry的位数为1
    23 carry.digit=1;
    24 //进到"0"位的有0
    25 carry.key[0]=0;
    26 //相乘,进位存到carry[j+1]
    27 for(j=0;j<num.digit;j++)
    28 {
    29 carry.key[j+1] = (i*num.key[j])/UNIT;
    30 //carry的位数增一
    31 carry.digit++;
    32 num.key[j] = (i*num.key[j])%UNIT;
    33 }
    34 //初始化进位为0
    35 d=0;
    36 //carry各个位加上去num的各个位
    37 for(j=0;j<num.digit && j<carry.digit;j++)
    38 {
    39 temp=d;
    40 d=(carry.key[j]+num.key[j]+d)/UNIT;
    41 num.key[j]=(carry.key[j]+num.key[j]+temp)%UNIT;
    42 }
    43 //假若num比carry位数多,而且有进位就继续加
    44 for(;j<num.digit && d;j++)
    45 {
    46 temp=d;
    47 d=(d+num.key[j])/UNIT;
    48 num.key[j]=(temp+num.key[j])%UNIT;
    49 }
    50 //假若carry比num位数多
    51 for(;j<carry.digit;j++)
    52 {
    53 temp=d;
    54 d=(carry.key[j]+d)/UNIT;
    55 num.key[j]=(carry.key[j]+temp)%UNIT;
    56 if(num.key[j]!=0)
    57 num.digit++;
    58 }
    59 if(d>0)
    60 {
    61 num.key[j]=d;
    62 num.digit++;
    63 }
    64 }
    65 for(j=num.digit-1;j>=0;j--)
    66 printf(j==num.digit-1?"%I64d":"%05I64d",num.key[j]);
    67 printf("\n");
    68 }
    69 }
    70
    71



  • 相关阅读:
    交换函数swap的三种实现方法
    oracle如何修改某一列的数据类型
    安装 kibana 以及添加中文分词器
    linux 安装Elasticsearch
    docker添加tomcat容器成功无法访问首页
    docker run-it centos提示FATAL
    启动、重新启动容器后,进入交互模式
    获取阿里云docker加速器地址
    CentOS6 修改默认字符集为GBK
    linux中如何查看redis的版本
  • 原文地址:https://www.cnblogs.com/ZShogg/p/2420058.html
Copyright © 2020-2023  润新知