• 高精度


    为了明天能交上作业,我现在来写题解了

    (鬼知道我今天晚上到底要写多少个题解)

    高精度加法·

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    char a1[10003],b1[10003];
    int a[10003],b[10003],c[10003];
    int ans = 0;
    int main()
    {
        gets(a1);
        gets(b1);
        int lena = strlen(a1),lenb = strlen(b1);
        for(int i = 1;i <= lena;i++)
        {
            a[i] = a1[lena - i] - 48;
        }
        for(int i = 1;i <= lenb;i++)
        {
            b[i] = b1[lenb - i] - 48;
        }//读入完成 
        for(int i = 1;i <= max(lena,lenb) + 1;i++)
        {
            c[i] += b[i] + a[i];
            c[i + 1] = c[i] / 10;
            c[i] = c[i] % 10;
            ans++;
        }//进行相加
        for(int i = ans;i >= 1;i--)
        {
            if(c[i] != 0) break;
            ans--;
        }//删除前导0
        for(int i = ans;i >= 1;i--)
        {
            printf("%d",c[i]);
        }
        return 0;//逆序输出
    }

    高精度减法

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 using namespace std;
     5 int main()
     6 {
     7     gets(a1);
     8     gets(b1);
     9     if(lena < lenb||(lena == lenb && strcmp(a1,b1) < 0))
    10     //strcmp为字符串比较函数,当n1 == n2,返回0;n1 < n2,返回负整数;n1 > n2,返回正整数;
    11     {
    12         printf("-");
    13         strcpy(n,a1);//把a1数组的值赋值给n数组 
    14         strcpy(a1,b1);
    15         strcpy(b1,n);
    16         //交换减数与被减数 
    17     }
    18     int lena = strlen(a1),lenb = strlen(b1);
    19     for(int i = 1;i <= lena;i++)
    20     {
    21         a[i] = a1[lena - i] - 48;
    22     }
    23     for(int i = 1;i <= lenb;i++)
    24     {
    25         b[i] = b1[lenb - i] - 48;    
    26     }
    27     int ans = 0;
    28     for(int i = 1;i <= max(lena,lenb);i++)
    29     {
    30         if(a[i] < b[i])
    31         {
    32             a[i + 1]--;//向前一位借位 
    33             a[i] = a[i] + 10;
    34         }
    35         c[i] = a[i] - b[i];
    36         ans++;
    37     }
    38     for(int i = ans;i >= 1;i--)
    39     {
    40         if(c[i] == 0) ans--;还是为了删除前导0
    41     }
    42     for(int i = ans;i >= 1;i--)
    43     {
    44         printf("%d",c[i]);
    45     }
    46     return 0;
    47 }

    高精度阶乘

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int a[256]; 
    int main()
    {
        int n;
        scanf("%d",&n);
        int l = 1;
        a[1] = 1;//为数组赋初值,避免一直到最后数组都输出0 
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= l;j++)//得出阶乘的结果 
            {
                a[j] = a[j] * i;
            }
            for(int j = 1;j <= l - 1;j++)//处理每一位是否进位 
            {
                a[j + 1] += a[j] / 10;
                a[j] = a[j] % 10;
            }
            if(a[l] > 10)//处理最高位是否进位 
            {
                a[l + 1] = a[l] / 10;
                a[l] = a[l] % 10; 
                l++;
            }
            for(int i = l;i >= 1;i--)
            {
                printf("%d",a[i]);
            }
        }
        return 0;
    } 

    高精度乘法

    就是按照人类正常计算乘法的顺序来写这个程序,设个双重循环保证每一位都被循环到,然后再进位就可以了

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    char a[1003],b[1003];
    int n[2003];
    int main()
    {
        gets(a);
        gets(b);
        int lena = strlen(a),lenb = strlen(b);
        for(int i = 0;i <= lena - 1;i++)
        {
            for(int j = 0;j <= lenb - 1;i++)
            {
                n[i + j + 1] += (int(a[i])- 48) * (int(b[i]) - 48); //把每一位 都乘上去然后再累加 
            }
        } 
        for(int i = lena + lenb - 1;i > 1;i++)
        {
            if(n[i] >= 10)
            {
                n[i - 1] += n[i] / 10;
                n[i] %= 10;
             } 
        } 
        for(int i = 1;i <= lena + lenb - 1;i++)
        {
            printf("%d",n[i]);
        }
        return 0;
    } 

    我现在很困

    但是明天还要交题解

    果然不作死就不会死

    如果上帝再给我一个周五,我一定投身于伟大的学习事业(连自己都不信/滑稽)

    高精度除法

    #include<cstdio>
    #include<cstring>
    char n[1005];
    long long temp,m;
    int main()
    {
        bool flag=0;
        scanf("%s%lld",n,&m);
        for (int i=0;i<strlen(n);i++)//输出整数部分
        {
            temp=temp*10+n[i]-'0';//上次余数乘10再加上这一位的数字
            if (temp/m!=0)//若小数点前的数均为0,则干脆什么也不输出
            flag=1;
            if (flag==1)
            printf("%d",temp/m);
            temp%=m;//每次做完除法之后的余数
        }
        printf(".");
        for (int i=1;i<=500;i++)//输出500位小数
        {
            temp*=10;//temp变化原理同整数部分
            printf("%d",temp/m);
            temp%=m;
        }
        return 0;
    }

    组合数

    快三点了,明天要是有人发现我在上课时睡着了记得叫我,此处手动@任艾茜小朋友

    算了我先睡了,明天再把它写完好了

     ~~~~~这是周五与周六的分割线~~~~~~~

    我又回来了

    这个写组合数标程的人真的太巨了!在此为他献上我的膝盖!!!

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    int a[30000],t,i,j,n,r,s;
    int b[21]; 
    const int maxn=20;
    void divide(int n)
    {
        int m;
        m=2;
        while (m*m<=n) 
        {
            while (n%m==0&&n!=0) //同样把分母也变成这种几个质因数相乘的形式 
            { 
                n=n/m;
                a[m]--;//分母中出现一个m,就可以把对应分子中的m约掉一个 
            }
            m++;
        }
        a[n]--;//最后除来除去剩下的没有被除掉的数也可以和分子中的这种数约掉 
    }
     
    void times(int n)  
    {
        int m; 
        m=2;              
        while (m*m<=n)
        {
            while(n%m==0&&n!=0)//为了约分,把一个数变成几个质因数相乘的形式 
            {
                n=n/m;
                a[m]++;//a[m]表示m这个数在分子中出现的个数 
            }
            m++;
        }
        a[n]++;//再给最后除来除去最后剩下那个数的个数加一 
    } 
    void add(int d)
    {
        int dd,i,t;
        i=1; j=0;     
        while (i<=maxn)     
        {
            t=b[i]*d+j; //这个就是一个正常的高精度了 
            b[i]=t%10;
            j=t/10; 
            i++;
        }
    }
     
    int main()
    {
        cin>>n>>r;
        memset(a,0,sizeof(a));
        i=n-r+1;
        j=r;
        do
        {
            if (i<=n)
            {
                times(i); i++;  //把每个数都分别乘进去的时候对每个数都进行相应的约分操作  
            }
            if (j>1)
            {
                divide(j); j--; 
            }
        }while(i<=n||j>1);
         
        memset(b,0,sizeof(b));
        b[1]=1;//为b数组第一位赋初值,防止乘到最后全是零 
        for (i=2;i<=29999;i++)//现在把约分最后没约掉的几个数乘起来 
        {
            while (a[i]>0)//只要分子中还有这个数,我们就继续乘  
            {
                add(i);
                a[i]--;//标志着i这个数已被乘完一次 
            }
        }
        for (j=10; j>=1;j--)
        cout<<b[j];
        cout<<endl;
        return 0;
    }

    终于补上了之前欠下的题解,现在整个人开始焕发新生!

  • 相关阅读:
    ELASTIC 动态修改配置API
    ELASTIC API
    ELASTIC索引监控脚本
    java并发多线程纪要
    Git 基础
    Linux 权限规划ACL
    Linux账号管理(二)
    Linux账号管理(一)
    Linux 备份工具dump
    Linux 文件压缩、打包
  • 原文地址:https://www.cnblogs.com/yupeiqi/p/8537213.html
Copyright © 2020-2023  润新知