zoukankan      html  css  js  c++  java
  • NYOJ 45( 分治,大数)

    试题链接
    分治的方法:http://blog.csdn.net/acm_JL/article/details/50938164

    根据分治的思想可以推导出递推式:f(k)=4*f(k-1)+1,且f(1)=1;
    可知需要用到大数乘法和加法。


    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        int a[101][100];
        memset(a,0,sizeof(a));
        int tail=0;  //指向最高位的索引
        int value;
        int carry=0;
        a[1][0]=1;
        for(int i=2; i<=100; i++)
        {
            for(int j=0; j<=tail; j++)   //大数乘法 f(k-1)*4
            {
                value=a[i-1][j]*4+carry;
                a[i][j]=value%10;
                carry=value/10;
                if(j==tail&&carry!=0)
                    tail++;
            }//从此循环出来时carry一定为0
    
            a[i][0]++;        //加 1 操作
            for(int n=0; n<=tail; n++)
            {
    
                if(a[i][n]<=9)
                    break;
                else
                {
                    value=a[i][n]+carry;
                    a[i][n]=value%10;
                    carry=1;  //因为是加1操作,只可能进1位
                }
                if(n==tail&&carry!=0)
                    tail++;
            }
        }
        //输出
        int cnt,k;
        cin>>cnt;
        while(cnt--)
        {
            cin>>k;
            if(k==1)
            {
                cout<<1<<endl;
                continue;
            }
            int i=99;
            while(a[k][i]==0)
                i--;
            for(int j=i; j>=0; j--)
                cout<<a[k][j];
            cout<<endl;
        }
        return 0;
    }


    优化:
    1.可以用一维数组去替代二维数组

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    int main()
    {
        int a[100];  //用一维数组去代替二维数组,优化空间复杂度
    	int n;
    	cin>>n;
    	while(n--)
        {
            memset(a,0,sizeof(a));
            int k;
            cin>>k;
            if(k==1)
            {
                cout<<1<<endl;
                continue;
            }
            a[0]=1;
    
            int tail=0;  //指向最高位的索引
            int carry=0;
    
            for(int i=2; i<=k; i++ )
            {
                for(int j=0; j<=tail; j++)
                {
                    a[j]=a[j]*4+carry;
                    if(j==0)
                        a[j]++;
                    carry=a[j]/10;
                    a[j]=a[j]%10;
    
                    if(j==tail&&carry!=0)
                        tail++;
                }//从此循环出来时carry一定为0
            }
    
            for(int i=tail; i>=0; i--)
                cout<<a[i];
            cout<<endl;
    
        }
    	return 0;
    }
    

  • 相关阅读:
    hibernate 高并发下遇到的大坑
    Spring Cloud微服务架构企业中的应用
    spring cloud学习-hystrix
    点评CAT接入手册
    centOS6.5 修改catalina.sh使用crontab自动切割日志tomcat8
    mariaDB安装报错
    linux安装rap需要的软件
    mariaDB的innodb恢复报错解决
    NFinal学习笔记 02—NFinalBuild
    NFinal 视图—用户控件
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746095.html
Copyright © 2011-2022 走看看