聪聪是一个善良可爱、睿智聪慧的好孩子。聪聪喜欢看书,这一天她在看一本书时看到
了这样一个问题:给你一个正整数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; }