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");
}
}