清北学堂学习总结day1

上午篇

一、高精度计算;

【以下内容先只考虑非负数情况】

•高精度加法:

   思路:【模拟竖式运算】

   注意:【进位】

•高精度减法:

   思路:【同加法类似,模拟竖式运算,进位变退位】

   注意: 【结果为负数的情况(一会儿讲到)】

•高精度乘法:

   思路:【类似,模拟竖式运算,考虑进位】

   注意:【结果为0的情况】

附总代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
char str[1000];
int a[1000],b[1000],c[1000];
int main(){
    scanf("%s", str);
    int len=strlen(str);
    //  '36' 
    for(int i=len-1;i>=0;i--)a[len-i]=str[i]-'0';
//    scanf("%s", str);
    int n=len;
    /*len=strlen(str);
    //  '36'
    for(int i=len-1;i>=0;i--)b[len-i]=str[i]-'0';
    int m=len;//将数字转成字符串输入
    n=max(n,m);*/
    
    
    //for(int i=1;i<=n;i++)c[i]=a[i]...b[i];//...处为运算符号
    /*for(int i=1;i<=n;i++){
        c[i+1]+=c[i]/10;
        c[i]%=10;//模拟进位,以下被注释掉的大多也一样;
    }*/-----高精加法部分
    /*for(int i=1;i<=n;i++)
        if(c[i]<0){
            c[i]+=10;
            c[i+1]-=1;
        }
        
    while(c[n]==0)n-=1;*/-----高精减法部分
    
    /*for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            c[i+j-1] += a[i]*b[j];
    
    for(int i=1;i<=n+m-1;i++){
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    n=n+m-1;
    while(c[n+1]>0)n+=1;*/-----高精乘法部分
    /*int B;
    cin>>B;
    cout<<B<<endl;
    for(int i=n;i>0;i--){
        c[i]=a[i]/B;
        a[i-1]+=(a[i]%B)*10;
    }
    while(c[n]==0 && n>0)n--;*/-----高精除以低精部分
    for(int i=n;i>0;i--)printf("%d",c[i]);
    
}

•那么,负数怎么办呢?

         其实可以分三种

         (1)加法:

                             一个数是负数:变为减法;

                             两个数是负数:全部变成正数算加法,最后取负;

         (2)减法:

                             被减数是负数:全部变为正整数算加法,最后取负

                             减数是负数:减数取负,变为加法

                             都是负数:都取负,变为减法,即(-减数)-(-被减数)

         (3)乘除法:

                             统计负数个数s

                             都变为非负数计算,若s为奇数,最后取负

二、模意义下运算

        

猜你喜欢

转载自www.cnblogs.com/juruohqk/p/10656660.html