高精度运算

1、 有关%运算

  • 类似题目之前写过一次,但是这次写到又给忘记了(# ̄~ ̄#)

  • 接下来看题:
    这里写图片描述

  • 代码如下:

#include<stdio.h>
__int64 yanghui[1050][1050];
int main(){
    int i,j;

    //求杨辉三角形
    for(i=0;i<1010;i++){
        for(j=0;j<=i;j++){
            if(j==0||j==i){
                yanghui[i][j]=1;
            }
            else {
                /*
                  由于yanghui[i][j]范围最终可能超过int
                  所以应当边%边+ 使yanghui[i][j]大小控制在一定范围内

                  同理如遇到乘法也应边%边*
                 */
                yanghui[i][j]=(yanghui[i-1][j-1]+yanghui[i-1][j])%707063423;
            }
        }
    }

    scanf("%d%d",&n,&m);
    printf("%I64d",yanghui[n][m]);

    return 0;
}

2、 数组模拟乘法

  • 运用数组模拟竖式乘法的过程来达到int范围不支持的高精度的运算
  • 例题题目:
    这里写图片描述
  • 代码如下:
/**************************************************************
        ***竖式乘法运算***                             

         1   2   3   4                                
      ×             5                                   
     --------------------                                 
               1   2                                   
                 7   0  写下个位,十位以上往前进位        
             3×5+2=17                                  
 **************************************************************
 *
   数组模拟运算类似此法
   每位数字先*i再进行进位 与 由低位到高位边乘i边进位效果相同
 *
 **************************************************************/

#include<stdio.h>
int a[3000]=1;//记录数字的每一位数。1000!大约有2500+位
int main(){
    int i,j;
    int n;
    int length=1;//记录数字长度
    scanf("%d",&n);

    a[1]=1;
    for(i=1;i<=n;i++){

        //每位数*i
        for(j=1;j<=length;j++){
            a[j] *= i;
        }

        //进阶
        for(j=1;j<=length;j++){
            a[j+1] += a[j]/10;//进位
            a[j] %= 10;//取个位
        }

        //此时j==length+1
        /*拆分最高位
         *
         *若a[j]==0则说明原最高位*i之后没有进位;a[j]!=0时则有进位
         *
         *a[j]可能不是一位数字 故需对a[j]进行拆分
         *并重新计算数字长度
         *
         */
        while(a[j] != 0){
            length++;
            a[j+1] += a[j]/10;
            a[j] %= 10;
            j++;
        }
    }

    for(i=length;i>=1;i--){
        printf("%d",a[i]);
    }
    printf("\n");

    return 0;
}
  • 以上代码中,a[i]仅存了一位数字。在内存和精度要求更高的情况下,可以使a[i]存三位四位甚至更多位的数字。只需要将以上代码中的10改成相应的10的倍数即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值