nyoj541最强DE战斗力

来源:互联网 发布:山东舜德数据 编辑:程序博客网 时间:2024/04/29 06:39

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


 

0 0