题目链接:https://www.luogu.com.cn/problem/U155612
题目有点问题,不能主动检测代码是否合法,就算你用while for,同样能过。但我这次写的的确是只使用if和printf的解法。
由于代码提交有文本上限,所以直接写肯定提交不了。所以我采用的方法的宏定义(宏定义不算,大概,也不知道能不能用函数,要不然递归也可以轻松解决,题目太不严谨)。
这个方法就是宏定义套宏定义。比如
#define p0 printf("qwq i am cute "); #define p1 p0 p0
这只要写入p1 世界上代码编译时就会自动转换成p0 p0 然后再被转换成printf("qwq i am cute "); printf("qwq i am cute "); 就达到缩减文本的目的。
然后就是判断输出几个字符串的情况了,直接写if一个一个判断那肯定太麻烦了,文本量也大,所以我们按位判断。
把n看成一个二进制数,当他第一位是1就打印一个字符串,第二位是1就打印2个字符串,第三位是1就打印4个字符串,以此类推,第i位是1就打印2 ^ (i-1)个,第i位是0就不打印,最后打印的字符串的总和就是n的数量
代码
#include<iostream> #include<algorithm> #include<vector> #include<cstring> #include<queue> #include<cstdio> #include<ctime> #define p0 printf("qwq i am cute "); #define p1 p0 p0 #define p2 p1 p1 #define p3 p2 p2 #define p4 p3 p3 #define p5 p4 p4 #define p6 p5 p5 #define p7 p6 p6 #define p8 p7 p7 #define p9 p8 p8 #define p10 p9 p9 #define p11 p10 p10 #define p12 p11 p11 #define p13 p12 p12 using namespace std; typedef long long ll; signed main(){ int n; scanf("%d",&n); //for(int i=0;i<13;i++){ // printf("#define p%d p%d p%d ",i+1,i,i); //} //for(int i=0;i<13;i++){ // printf("if(n>>%d&1){ p%d} ",i,i); //} if(n>>0&1){ p0} if(n>>1&1){ p1} if(n>>2&1){ p2} if(n>>3&1){ p3} if(n>>4&1){ p4} if(n>>5&1){ p5} if(n>>6&1){ p6} if(n>>7&1){ p7} if(n>>8&1){ p8} if(n>>9&1){ p9} if(n>>10&1){ p10} if(n>>11&1){ p11} if(n>>12&1){ p12} scanf(" "); }