nyoj541
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=541
1. 数字二和三能组成任何数, 因此一个数的最大值的乘积 为2^m * 3^n
2. 然而3^n > 2^n ,能用3就不用2 ( 3 > 1*2 ,n=1次时),但同时要考虑一个问题 ,什么时候用2 不用 3,
其实就是 一种情况 除3的时候有余数1就浪费了 1*x,不如 给2 ,就像4 这样 4-3 = 1 1*3 < 2*2 。
3.然后就是高进度运算了,容易错,因为我在这里有一个长度控制, 那么就存在有些有些位有进位,有些没有,那么需要一个合适判断条件 去结束循环,有些人直接整体刷表,也可以肯方便,还不易错。
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int s1[2000]; void change(int n) { int i; for(i = 1;i<s1[0];i++) { s1[i] = s1[i]*n; } int t = 0,s; i = 1; while(1) { s = (s1[i]+t)%10; t = (s1[i]+t)/10; s1[i] = s; i++; if( t==0 && i>= s1[0])break; //这个控制很关键 } s1[0] = max(s1[0] , i); } int main() { int n,m,i; scanf("%d",&n); while(n--) { memset(s1,0,sizeof(s1)); scanf("%d",&m); s1[0] = 2; s1[1] = 1; for(;m-3>=2 || m-3 == 0;m=m-3) //如果最后发生 4 的情况排除即可。 { change(3); } for(;m-2>=0;m=m-2) { change(2); } for(i = s1[0]-1;i>=1;i--) printf("%d",s1[i]); printf("\n"); } }