zoukankan      html  css  js  c++  java
  • 最小公倍数(数学)


    其实也没什么。。就是用到了按位取模和最后对整个数取模的答案是一样的结论。但是蒟蒻我想的太复杂了,甚至还写了高精度。。。。
    放上丑陋无比的代码。。。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<map>
    #define MAXN 246913578
    #define mod 1234567890
    using namespace std;
    string s;
    map<int,int>m;
    int a[200010],b[200010],c[400010];
    long long cur,cur_ans;
    long long getsum()
    {
    	long long sum=0;
    	for(int i=0;i<s.length();i++)
    		sum=sum*10+(s[i]-'0');
    	return sum;
    }
    void solve(int k)
    {
    	int sum=0;
    	for(int i=0;i<s.length();i++) 	
    		sum=(sum*10+(s[i]-'0'))%k;
    	if(sum==0) m[k]++;
    	if(sum==0&&k==9) m[3]++;
    }
    void mul(string n1,string n2)
    {
        int lena=n1.length(),lenc=0,x=0;
        int lenb=n2.length();
        //cout<<"lena="<<lena<<" lenb="<<lenb<<endl;
        //cout<<"n1="<<n1<<" n2="<<n2<<endl;
        for(int i=0;i<lena;i++)     a[lena-1-i]=n1[i]-'0';
        for(int i=0;i<lenb;i++)     b[i]=n2[i]-'0';
        for(int i=0;i<lena;i++)
        {
            x=0;
            for(int k=0;k<lenb;k++)
            {
                c[i+k]+=a[i]*b[k]+x;
                x=c[i+k]/10;
                c[i+k]%=10;
            }
            c[lenb+i]=x;
        }
        lenc=lena+lenb;
        while((c[lenc]==0)&&(lenc>0))  lenc--;
        for(int i=lenc;i>=0;i--) cur_ans=(cur_ans*10+c[i])%mod;//cout<<c[i];
        cout<<cur_ans<<endl;
        // for(int i=lenc;i>=0;i--) cout<<c[i];
        //cout<<endl;
        return;
    }
    int main()
    {
    	freopen("lcm.in","r",stdin);
    	freopen("lcm.out","w",stdout);
    	cin>>s;
    	long long a=MAXN;
    	if(s.length()<=9) 
    	{
    		cur=getsum();
    		if(MAXN%cur==0)
    		{
    			cout<<MAXN<<endl;
    			return 0;
    		}
    	}
    	solve(2);
    	solve(3);
    	solve(9);
    	solve(3607);
    	solve(3803);
    	if(m[2]) a/=2;
    	if(m[3]) a/=3,m[3]--;
    	if(m[3]) a/=3;
    	if(m[3607]) a/=3607;
    	if(m[3803]) a/=3803;
    	//cout<<"a="<<a<<endl;
    	string aa;
    	while(a)
    	{
    		aa+=(char)(a%10+'0');
    		a/=10;
    	}
    	//cout<<"aa="<<aa<<endl;
    	mul(s,aa);
    	return 0;
    }
    
  • 相关阅读:
    堆中的路径
    二叉搜索树的操作集
    windows 利用凭据进行远程连接
    解决通过域名访问不了
    Linux 安装redis
    mybatis之resultType
    nuxt 引入swiper插件报错 Cannot resolve swiper/dist/css/swiper.css
    windows 设置连接linux redis
    linux 安装redis报gcc错误
    maven打包好的jar安装到本地库
  • 原文地址:https://www.cnblogs.com/fengxunling/p/9749449.html
Copyright © 2011-2022 走看看