整数最优分解问题
整数最优分解问题
| Time Limit: 5000MS | Memory Limit: 65535KB |
| Submissions: 100 | Accepted: 26 |
Sample Input
10
Sample Output
36
解析:
这道题其实举几个例子就会很清晰了
最优分解乘积:1~4的是自身;5->3*2=6;6->3*3=9;7->3*4=12;8->3*3*2=18;9->3*3*3=27;10->3*3*4=36
很明显的规律出来了2,3,4一循环就有3的递增,因此就有个方法:用给出的数对3取余,有余数确定是2,3,4中的哪个,然后就边减3边乘3,这样结果就出来了;我这里只是做了个简化,两个3一起乘(即乘9);有人就会问为啥不3个3一起乘呢?原因在这里给出数的上限大约在10000,那么最后得到的数有多大,可想而知,因此要用字符数组存储,就会涉及到每位的乘法,如果是3个3,就会是27乘其他数,就没一位数乘一位数那么简便,就麻烦很多了
# include<stdio.h> char res[10005]; int len; void mul(int num) { int sign=0,dg,i; for(i=0;i<len;i++) { dg=res[i]-'0'; dg=dg*num+sign; sign=dg/10; //进位标记 dg%=10; //本位需要保存的数值 res[i]=dg+'0'; } if (sign!= 0) //用这个假设是以防首位出现零的情况 { res[i]=sign+'0'; len++; } } void f(int n) { int n3,n2,i; if (n%2==0) n3=n/6*2; //记录3的个数 else n3=(n-3)/6*2+1;//如果是奇数,肯定就会有个单出来的3 n2=n-3*n3; //n2只会是0,2或4 for(i=0;i<n3/2;i++) //n3/2相当于6的个数,那么就会出现多少个乘积9 mul(9); if(n3%2) // 奇数要算上单出的3 mul(3); if(n2) mul(n2); } int main() { int n,i; scanf("%d",&n); if(n<=4) printf("%d\n",n); else { res[0] ='1'; len=1; f(n); for (i=len-1;i>=0;i--) printf("%c",res[i]); printf("\n"); } return 0; }
浙公网安备 33010602011771号