zoukankan      html  css  js  c++  java
  • 高精度

    //1.读入字符串 
    
    //scanf
    //可以同一行,中间用空格隔开,也可以两行
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s1[1010],s2[1010];
    int main(){
        scanf(%s%s,s1,s2);
        int lena=strlen(s1);
        int lenb=strlen(s2);
        ...
    } 
    //gets
    //只能两行
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s1[1010],s2[1010];
    int main(){
        gets(s1);gets(s2);
        int lena=strlen(s1);
        int lenb=strlen(s2);
        ...
    } 
    //cin
    //可以同一行,中间用空格隔开,也可两行
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main(){
        string s1,s2;
        cin>>s1>>s2;
        int lena=strlen(s1);
        int lenb=strlen(s2);
        ...
    } 
    
    //2.存入数组
    //注意倒叙    1~len -> 低位~高位 
    for(int i=1;i<=lena;i++){
        a[i]=s[lena-i]-'0';//字符串最后一位是'0'
    }
    
    //3.加法
    //(1)模拟手工计算,设置一个进位标记m 
    int m=0;
    lenc=max(lena,lenb);
    for(int i=1;i<=lenc;i++){
        c[i]=(m+a[i]+b[i])%10;
        m=(m+a[i]+b[i])/10;
    }
    if(m==1){
        lenc++;
        c[lenc]=1;
    }
    //(2)先计算后处理进位
    for(int i=1;i<=lenc;i++)
        c[i]=a[i]+b[i];
    for(int i=1;i<=lenc;i++){
        c[i+1]=c[i+1]+c[i]/10;
        c[i]=c[i]%10l
    }
    if(c[lenc+1]==1) lenc++;
    //(2)++  去掉c数组
    lena>lenb
    for(int i=1;i<=lena;i++) a[i]=a[i]+b[i];
    for(int i=1;i<=lena;i++){
        a[i+1]=a[i+1]+a[i]/10;
        a[i]=a[i]%10;
    } 
    if(a[lena+1]==1) lena++;
    
    //4减法
    //(1)借位 
    for(int i=1;i<=lena;i++){
        if(a[i]<b[i]){
            a[i+1]--;
            a[i]+=10;
        }
        a[i]-=b[i];
    } 
    //(2)输出
    while(a[lena]==0&&lena>1) lena--;
    for(int i=lena;i>=1;i--)
        cout<<a[i];
    cout<<endl; 
    //(3)谁减谁的问题
    if(strcmp(s1,s2)==0) {cout<<0<<endl;return 0;}
    if(lena<lenb||lena==lenb&&strcmp(s1,s2)<0){
        strcpy(s3,s1);
        strcpy(s1,s2);
        strcpy(s2,s3);
        swap(lena,lenb);
        cout<<'-';
    } 
    //5乘法
    for(int i=1;i<=lena;i++)
        for(int j=1;j<=lenb;j++)
            c[i*j-1]=a[i]*b[j];
    int lenc=lena+lenb-1;
    for(int i=1;i<=lenc;i++){
        c[i+1]=c[i+1]+c[i]/10;
        c[i]%=10;
    }
    if(c[lenc+1]>0) lenc++;
    //6位运算结果的输出
    for(int i=lenc;i>=1;i--)
        cout<<c[i]<<" "; 
    cout<<endl;
  • 相关阅读:
    C# winform 若要在加载设计器前避免可能发生的数据丢失,必须纠正以下错误
    C# 邮件发送系统
    IIS配置网站(WebServices),局域网都能访问
    C# 遍历窗体控件顺序问题
    zynqmp(zcu102rev1.0)系列---1---安装 xsdk
    linux 系统中将数据写入文档不能立即保存问题的解决方法
    virtualbox ubuntu16.04 自动挂载共享文件夹
    linux c 读写 ini 配置文件
    指针与 const --- 指针常量与常量指针
    Linux SD卡建立两个分区
  • 原文地址:https://www.cnblogs.com/lcan/p/9482275.html
Copyright © 2011-2022 走看看