nyoj541最强DE战斗力

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


 

你可能感兴趣的:(c,ACM)