都有规律,只是小数据模拟起来很麻烦,但是大数据模拟却十分简单。
可以考虑小数据全部打表,或者只把麻烦的部分打表,大数据全部程序模拟。
其实如果再来一次,我还是会选择模拟而不是打表,毕竟打表太麻烦,而且模拟也不算太复杂,就是对细节要求高。
在获得思路的过程中往往会尝试很多想法,可能到最后你找到正确的思路后,那些错误的思路会干扰你(其实就是说,虽然找到了正确的思路,但是没有完全想清楚)。
这时候最好能重新捋一遍,画一画流程图,把算法弄清楚,能减少你在后面编码时犯错的可能。
在实现的过程中可能会遇到一些不好实现的算法,特别是那些指针,下标之类的模拟,很容易犯错。这时也最好能先在纸上模拟一下,把指针的细节想清楚,再来编写。(数学题也是类似,把计算方法或公式等细节想清楚)
代码
#include<stdio.h>
#include<assert.h>
using namespace std;
int n;
int s4()
{
puts("1 * 2");
puts("5 + 3");
puts("6 + 4");
return 0;
}
int s5()
{
puts("1 * 2");
puts("3 * 6");
puts("7 - 4");
puts("8 / 5");
return 0;
}
int s26()
{
puts("1 + 2");
for(int i=1;i<11;i++) printf("%d + %d\n",i+26,i+2);
puts("37 / 13");
puts("14 + 15");
for(int i=1;i<11;i++) printf("%d + %d\n",i+38,i+15);
puts("49 / 26");
puts("38 + 50");
return 0;
}
int dispos(int num)
{
if(num==n) return 0;
assert(num+2<=n);
printf("%d - %d\n",num+1,num+2);
for(int i=3;i+num<=n;i++) printf("%d / %d\n",n+num+i-3,num+i);
if(num==1) return 0*printf("%d + %d\n",num,2*n-2);
else return 0*printf("%d + %d\n",num+n-1,2*n-2);
}
int small()
{
int num=1;
int sum=n;
for(;sum+n<=24;num++,sum+=n)
{
if(num==1) puts("1 + 2");
else printf("%d + %d\n",num+1,n+num-1);
}
if(sum==24) return 0*dispos(num);
int NUM = num;
int i;
for(i=1;i<24-sum;i++)
{
if(i==1) printf("%d + %d\n",num+i,num+i+1);
else printf("%d + %d\n",num+i+1,n+num+i-2);
}
num+=i;
if(i==1) printf("%d / %d\n",num,num+1);
else printf("%d / %d\n",n+num-2,num+1);
num++;
if(NUM==1) printf("%d + %d\n",NUM,n+num-2);
else printf("%d + %d\n",n+NUM-1,n+num-2);
return 0*dispos(num);
}
int big()
{
puts("1 + 2");
for(int i=1;i<23;i++) printf("%d + %d\n",n+i,i+2);
printf("%d / %d\n",n+23,25);
dispos(25);
return 0;
}
int solve()
{
if(n<=3) return 0*puts("-1");
if(n==4) return 0*s4();
if(n==5) return 0*s5();
if(n==26) return 0*s26();
if(n<=24) return 0*small();
else return 0*big();
}
int main()
{
while(~scanf("%d",&n)) solve();
return 0;
}