高精总结(未完结)

高精度是一种计算方式,如果数据过大,会爆掉longlong,就需要用数组来模拟每一位,进行加减乘除,模拟进退位。

用高精时,要将个位赋值在数组第一个,输出时反向输出,不要弄反,不然会紊乱;

高精加

多考虑进位,这是重点;

#include<iostream>
#include<cstring>
using namespace std;
int x=0,a1[241],a2[241],b[241],o;
string s1,s2;
void ax()
{
    cin>>s1>>s2;//输入字符串
    a1[0]=s1.length();//长度
    for(int i=1;i<=a1[0];i++)
        a1[i]=s1[a1[0]-i]-48;//ASCII码值 转化
    a2[0]=s2.length();//长度
    for(int i=1;i<=a2[0];i++)
        a2[i]=s2[a2[0]-i]-48;
}
//习惯上从一开始循环,所以把个位赋值到1上,输出时反过来
void as(int a1[],int a2[])
{
    int i=1;
    while((i<=a1[0])&&(i<=a2[0]))
    {
        b[i]=a1[i]+a2[i]+x;//x是进位
        x=b[i]/10;//计算进位
        b[i]%=10;
        i++;
    }
    if(x!=0)
        b[i]=x;
    else
        i--;
    o=i;
}
int main()
{
    ax();
    as(a1,a2);
    for(int j=o;j>=1;j--)
        cout<<b[j];//反向输出
}

高精减

借位借位啊

要注意 减完之后高位可能会有0,输出前要去掉

#include<iostream>
#include<cstring>
using namespace std;
int a1[241],a2[241],b[241],o,n;
string s1,s2;
bool ad(int a1[],int a2[])//判断哪个大,用来当被减数
{
    n=1;
    if(a1[0]<a2[0]) n=0;
    if((a1[0]==a2[0])&&(s1<s2)) n=0;
    return n;
}
void ax()//输入,赋值,反向赋值
{
    cin>>s1>>s2;
    a1[0]=s1.length();
    for(int i=1;i<=a1[0];i++)
        a1[i]=s1[a1[0]-i]-48;
    a2[0]=s2.length();
    for(int i=1;i<=a2[0];i++)
        a2[i]=s2[a2[0]-i]-48;
}
void as(int a1[],int a2[])//减
{
    int i=1;
    while(i<=a1[0])
    {
        if(a1[i]<a2[i])
        {
            b[i]=a1[i]+10-a2[i];
            a1[i+1]--;//借位
        }
        else
        {
            b[i]=a1[i]-a2[i];
        }
        i++;
    }
    while((b[i]==0)&&(i>1))
        i--;//减完之后,前面有可能有0,要去掉后再输出
    o=i;
}
int main()
{
    ax();
    if(ad(a1,a2)==1)
        as(a1,a2);
    else
    {
        as(a2,a1);
        cout<<"-";
    }
    for(int j=o;j>=1;j--)
        cout<<b[j];
}

高精乘

同高精加,只不过这回进位要大一点了

乘到哪一位

比如100*100=10000

最高位相乘的个位是i+j-1

再多出来的十位,算到进位中。

#include<iostream>
#include<cstring>
using namespace std;
int x=0,a1[1001],a2[1001],b[1000001],o=0;
string s1,s2;
void ax()//输入
{
    cin>>s1>>s2;
    a1[0]=s1.length();
    for(int i=1;i<=a1[0];i++)
        a1[i]=s1[a1[0]-i]-48;
    a2[0]=s2.length();
    for(int i=1;i<=a2[0];i++)
        a2[i]=s2[a2[0]-i]-48;
}
void as(int a1[],int a2[])
{
    for(int i=1;i<=a1[0];i++)//因为乘法每一位都要相乘
    {
        for(int j=1;j<=a2[0];j++)//所以两层循环
        {
            b[i+j-1]+=a1[i]*a2[j]+x;//相乘
            x=b[i+j-1]/10;//进位
            b[i+j-1]%=10;//余下的
            o=i+j-1;//总位数
        }
        if(x!=0)
        {
            b[o+1]=b[o+1]+x;
            x=0;
            o=o+1;
        }
    }
}
int main()
{
    ax();
    as(a1,a2);
    for(int j=o;j>=1;j--)
        cout<<b[j];
}

高精除

原文地址:https://www.cnblogs.com/fengwu2005/p/11270105.html

时间: 2024-10-16 22:36:30

高精总结(未完结)的相关文章

高精-----各种模板

高精加法 代码 #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[501]; int x[501],y[501],z[50000]; int main() { cin>>a; cin>

VIjos 大整数(超级恶心的高精)

背景 很久很久以前,有个整数很大很囧 描述 一个k(1<=k<=80)位的十进制正整数N,就是所谓的大整数.请你设计程序,对于给出的某一个大整数N,找到满足p^3+p^2+3p<=n的p的最大值. 格式 输入格式 输入数据只有一行,是一个K位的大整数N,行首行未无多余空格 输出格式 输出第一行为你所找到的P最大值,行首行末别乱加东西 样例1 样例输入1 1000000000000001000000000000003000000000000001 Copy 样例输出1 1000000000

[BZOJ 2729][HNOI2012]排队(排列组合+高精)

Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) Solution 好像必须写压位高精的QAQ 先排n名男生,插空,讨论两名老师插在两个不同的空里的情况和先排在一起再在中间插一名女生的情况 #include<iostream> #include<cstdio> #include<cstring> #include&

BZOJ_1002_[FJOI2007]_轮状病毒(递推+高精)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 分析 题目是求一种特殊的图的生成树的个数,但是貌似有更一般的算法,等明天再看吧... 只搞懂了打表找规律,然后题推的解法. 随便写个暴力打个表(其实我并不会写,明天再写吧今天好累),找一找规律. 1~14的答案如下 1 5 16 45 121 320 841 2205 5776 15125 39601 103680 271441 71

模板——高精系列

存放一下高精的模板 高精加: #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int a[1001],b[1001],c[1001],lena,lenb; char a1[1001],b1[1001]; int main(){ gets(a1); gets(b1); lena=strlen(a1); lenb=strlen

c++普通高精加

//作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio>#include<cstring>int main(){char s1[600],s2[600];int a1[600],a2[600],a3[600]={0},len1,len2,i;scanf("%s",s1);scanf("%s",s2);len1

高精阶乘

求n!.当n很大的时候,会超出整数的范围. 这里用数组来进行高精阶乘.a[1]是个位,a[2]是十位......依次类推.每次要乘一个数的时候,就从个位(即a[1])开始乘这个数,>10的时候要%10再进位. 1 #include<cstdio> 2 #include<cstring> 3 const int N=100000; 4 5 int a[N]; 6 int i, j, n; 7 int t, pos/*位数*/, carry/*进位*/; 8 9 int main

bzoj 3287: Mato的刷屏计划 高精水题 &amp;&amp; bzoj AC150

3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Description Mato同学喜欢上QQ,但是有少数傻逼总是问他一些弱智问题.Mato感到很反感,想要鄙视一下他们.他决定在QQ上刷屏,也就是发出一大堆字符.Mato的键盘上有4个键:A.B.C.D.按A就会输入一个字符,按B会把所有字符选中,按C会把选中的字符放入剪贴板,按D会插入剪贴板的内容.他的

[贪心][高精]P1080 国王游戏(整合)

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国