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

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

高精度加法·

#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;
}

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