c++聪聪看书(满分代码)

聪聪是一个善良可爱、睿智聪慧的好孩子。聪聪喜欢看书,这一天她在看一本书时看到了这样一个问题:给你一个正整数n,你要将它分成若干个自然数Ai的和的形式,并且使得这若干个自然数Ai的乘积尽量大,并输出最大乘积。比如n=5的情况,最优的方案是5=2+3,答案为6。这么简单的问题聪聪当然会做了,她想考考你,你能不能比她先给出问题的答案呢?

【输入】
      输入文件名为reading.in 共1行,包含1个正整数n。
【输出】
      输出文件reading.out 共1行,包含1个整数,表示最大乘积。
【输入输出样例】
      reading.in/reading.out
      7

      12

【数据范围】
      对于30%的数据,1≤n≤10。
      对于60%的数据,1≤n≤100。
      对于100%的数据,1≤n≤10000。

原文地址:http://www.cnblogs.com/scx2015noip-as-php/p/ccks.html

思路在上面那个之前的贴子网址说过了,上次我们遗留下一个问题,就是n=10000时,结果太大,所以我们要高精度。所以现在不多说,上高精度代码,核心代码和上次60分算法一样,剩下40分在这次代码里面用高精解决了。

#include<iostream>
#include<cstring>
using namespace std;
void multi(char *a,char *b)//这个函数用来高精度乘法,这里的指针用在函数里代入了数组
{
    int x[2001],y[2001];
    int s[2001]={0};
    int lena=strlen(a),lenb=strlen(b);
    int i,j,t;
    for(i=0;i<=lena;i++) x[i]=a[lena-i-1]-'0';
    for(i=0;i<=lenb;i++) y[i]=b[lenb-i-1]-'0';
    for(i=0;i<lena;i++)
    {
        for(j=0;j<lenb;j++)
        {
            s[i+j]+=(x[i])*(y[j]);
            if(s[i+j]>9)
            {
                s[i+j+1]+=s[i+j]/10;
                s[i+j]%=10;
            }
        }
    }
    t=lena+lenb+2;
    while(t>0 && s[t]==0) t--;
    for(i=t;i>=0;i--) a[t-i]=s[i]+'0';
}
int main()
{
    char a[2001]={0},b[2]={0},c[2]={0};//a数组设置2000位足够
    long long n,ans=1;
    itoa(3,b,10);//b设为3,在算法方面对a进行乘3工作
    cin>>n;
    if(n<=4) itoa(n,a,10);//这个if/else可以去了,下面的判断中n<=4时它的结果就自动是n了,不信可以试试
    else
    {
        itoa(ans,a,10);//a设初值1
        while(n>4)
        {
            n-=3;
            multi(a,b);
        }
        if(n!=0){itoa(n,c,10);multi(a,c);}//把n转为字符数组c,然后a和c高精度乘法(等于之前那篇文章的m*n),和之前那篇文章思路等价
    }
    cout<<a;//a数组不必循环,可直接打出来
    return 0;
}
posted @ 2015-10-03 15:30  大本营  阅读(833)  评论(0编辑  收藏  举报