zoukankan      html  css  js  c++  java
  • 大数常用计算模板及例题

    一、模板&例题

    【两个大数相加】

    string sum(string s1,string s2)
    {
    	if(s1.length()<s2.length())
    	{
    		string temp=s1;
    		s1=s2;
    		s2=temp;
    	}
    	int i,j;
    	for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    	{
    		s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
    		if(s1[i]-'0'>=10)
    		{
    			s1[i]=char((s1[i]-'0')%10+'0');
    			if(i) s1[i-1]++;
    			else s1='1'+s1;
    		}
    	}
    	return s1;
    }
    

    题目:光棍的yy

    题解:

     1 #include <iostream>
     2 #include <string>
     3 #include <cstdio>
     4 using namespace std;
     5 string sum(string s1,string s2)
     6 {
     7     if(s1.length()<s2.length())
     8     {
     9         string temp=s1;
    10         s1=s2;
    11         s2=temp;
    12     }
    13     int i,j;
    14     for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    15     {
    16         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
    17         if(s1[i]-'0'>=10)
    18         {
    19             s1[i]=char((s1[i]-'0')%10+'0');
    20             if(i) s1[i-1]++;
    21             else s1='1'+s1;
    22         }
    23     }
    24     return s1;
    25 }
    26 int main()
    27 {
    28     int n,T;
    29     scanf("%d",&T);
    30     while(T--)
    31     {
    32         string s;cin>>s;
    33         if(s.size()==1){
    34                 printf("1
    ");continue;
    35         }
    36         else if(s.size()==2)
    37         {
    38             printf("2
    ");continue;
    39         }
    40         string ans,a="1",b="2";
    41         for(int i=3;i<=s.size();i++)
    42         {
    43             ans=sum(a,b);
    44             a=b;
    45             b=ans;
    46         }
    47         cout<<b<<endl;
    48     }
    49     return 0;
    50 }
    光棍的yy

    【大数乘以整型数】

    string Except(string s,int x)  //大数除以整形数
    {
        int cmp=0,ok=0;
        string ans="";
        for(int i=0;i<s.size();i++)
        {
            cmp=(cmp*10+s[i]-'0');
            if(cmp>=x)
            {
                ok=1;
                ans+=(cmp/x+'0');
                cmp%=x;
            }
            else{
                if(ok==1)
                    ans+='0';  //注意这里啊。才找出错误
            }
        }
        return ans;
    }
    

    题目:最强DE战斗力

    题目:合并游戏

    题解:点击

    【大数除以整型数】

    string Except(string s,int x)  //大数除以整形数
    {
        int cmp=0,ok=0;
        string ans="";
        for(int i=0;i<s.size();i++)
        {
            cmp=(cmp*10+s[i]-'0');
            if(cmp>=x)
            {
                ok=1;
                ans+=(cmp/x+'0');
                cmp%=x;
            }
            else{
                if(ok==1)
                    ans+='0';  //注意这里啊。才找出错误
            }
        }
        return ans;
    }
    

    【大数乘法】

    思想就是模拟乘法运算,用大数乘以另一个数的每一位然后大数相加就是ans

    string sum(string s1,string s2)    //大数相加
    {
    	if(s1.length()<s2.length())
    	{
    		string temp=s1;
    		s1=s2;
    		s2=temp;
    	}
    	int i,j;
    	for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    	{
    		s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
    		if(s1[i]-'0'>=10)
    		{
    			s1[i]=char((s1[i]-'0')%10+'0');
    			if(i) s1[i-1]++;
    			else s1='1'+s1;
    		}
    	}
    	return s1;
    }
    string Mult(string s,int x)  //大数乘以整形数
    {
        reverse(s.begin(),s.end());
        int cmp=0;
        for(int i=0;i<s.size();i++)
        {
            cmp=(s[i]-'0')*x+cmp;
            s[i]=(cmp%10+'0');
            cmp/=10;
        }
        while(cmp)
        {
            s+=(cmp%10+'0');
            cmp/=10;
        }
        reverse(s.begin(),s.end());
        return s;
    }
    string Multfa(string x,string y)  //大数乘法
    {
        string ans;
        for(int i=y.size()-1,j=0;i>=0;i--,j++)
        {
            string tmp=Mult(x,y[i]-'0');
            for(int k=0;k<j;k++)
                tmp+='0';
            ans=sum(ans,tmp);
        }
        return ans;
    }
    

    题目:Bull Math

    【浮点数的n次方】

    string Multiply(string s,long x)  //大数乘以整形数
    {
        reverse(s.begin(),s.end());
        long cmp=0;
        for(int i=0; i<s.size(); i++)
        {
            cmp=(s[i]-'0')*x+cmp;
            s[i]=(cmp%10+'0');
            cmp/=10;
        }
        while(cmp)
        {
            s+=(cmp%10+'0');
            cmp/=10;
        }
        reverse(s.begin(),s.end());
        return s;
    }
    string Remove_later(string s)   //删除一个字符串的后倒0
    {
        int ok=1;
        for(int i=s.size()-1; i>=0; i--)
        {
            if(s[i]=='0'){
                s.erase(i);
            }
            else if(s[i]=='.')
            {
                s.erase(i);
                ok=0;
            }
            else
                ok=0;
            if(ok==0)
                break;
        }
        return s;
    }
    string factorial(string s,int n)   //浮点数的n次方
    {
        if(n==0)
            return "1";
        string cmp="",count="";
        long x=0,point=0;
        for(int i=0; i<s.size(); i++)
            if(s[i]!='.')
            {
                cmp+=s[i];
                x=x*10+(s[i]-'0');
            }
            else
                point=s.size()-1-i;
        for(int i=1; i<n; i++)
        {
            cmp=Multiply(cmp,x);
        }
        int ans_point=cmp.size()-n*point;
        if(ans_point<0)
        {
            count+='.';
            for(int i=ans_point; i!=0; i++)
                count+='0';
        }
        string::iterator it=cmp.begin();
        if(ans_point>=0&&ans_point<cmp.size())
            cmp.insert(it+ans_point,'.');
        count+=(Remove_later(cmp));
        return count;
    }
    

    【字符串去除后导0函数,前导0可以先反转取后导】

    string Remove_later(string s)   //删除一个字符串的后倒0
    {
        for(int i=s.size()-1; i>=0; i--)
        {
            if(s[i]=='0')
                s.erase(i);
            else
                break;
        }
        return s;
    }
    

    题目:Adding Reversed Numbers

    二、例题汇总

    题目一、424 - Integer Inquiry  大数加法

    题目二、10106 - Product 简单大数乘法

    题目三、10494 - If We Were a Child Again 大数除以高精度数

    题目四、Uva113 - Power of Cryptography 求大数开n次方的结果

    题解:点击

  • 相关阅读:
    【Ionic+AngularJS 开发】之『个人日常管理』App(一)
    [热拔插] 轻量级Winform插件式框架
    Electron开发
    Cordova+Ionic之坑
    Unity学习笔记
    【树结构数据同步】公司部门—通讯录数据同步
    java enum用法
    Java中哈希表(Hashtable)是如何实现的
    注意for循环中变量的作用域
    BI-日期维度表-SQL SERVER
  • 原文地址:https://www.cnblogs.com/xzxl/p/7271983.html
Copyright © 2011-2022 走看看