一条语句来实现

时间:2021-04-02 00:38:41
写一个函数 int p(int i, int N);

能够输出i到N再到i,即以参数1,7调用函数,输出结果为

1

2

3

4

5

6

7

6

5

4

3

2

1

要求只用一个语句完成,不允许用?:等n多操作符和关键字。只能用一个printf库函数

40 个解决方案

#1


引用楼主 zxqwxyql 的回复:
写一个函数 int p(int i, int N);

能够输出i到N再到i,即以参数1,7调用函数,输出结果为

1

2

3

4

5

6

7

6

5

4

3

2

1

要求只用一个语句完成,不允许用?:等n多操作符和关键字。只能用一个printf库函数

一个语句?既然返回值是int,那必须得返回一个值吧,哪来其他语句printf

#2


这么有难度的题目多给点分数嘛

#3


除了?:和关键字,其他都可以用吗?

#4


原来return都不让用啊,太残忍了,我匿了....

#5


不明白为什么总要用这种无聊的限制来麻烦自己

#6


函数名: printf 
功  能: 产生格式化输出的函数 
用  法: int printf(char *format...); 
程序例: 

#include <stdio.h> 
#include <string.h> 

#define I 555 
#define R 5.5 

int main(void) 

   int i,j,k,l; 
   char buf[7]; 
   char *prefix = buf; 
   char tp[20]; 
   printf("prefix  6d      6o      8x        10.2e        " 
          "10.2f\n"); 
   strcpy(prefix,"%"); 
   for (i = 0; i < 2; i++) 
   { 
      for (j = 0; j < 2; j++) 
         for (k = 0; k < 2; k++) 
     for (l = 0; l < 2; l++) 
            { 
               if (i==0)  strcat(prefix,"-"); 
               if (j==0)  strcat(prefix,"+"); 
               if (k==0)  strcat(prefix,"#"); 
               if (l==0)  strcat(prefix,"0"); 
               printf("%5s |",prefix); 
               strcpy(tp,prefix); 
               strcat(tp,"6d |"); 
               printf(tp,I); 
               strcpy(tp,""); 
               strcpy(tp,prefix); 
               strcat(tp,"6o |"); 
               printf(tp,I); 
               strcpy(tp,""); 
               strcpy(tp,prefix); 
               strcat(tp,"8x |"); 
               printf(tp,I); 
               strcpy(tp,""); 
               strcpy(tp,prefix); 
        strcat(tp,"10.2e |"); 
        printf(tp,R); 
        strcpy(tp,prefix); 
        strcat(tp,"10.2f |"); 
        printf(tp,R); 
        printf("  \n"); 
        strcpy(prefix,"%"); 
     } 
       } 
   return 0; 


你可以研究一下是否可行。

#7


#include "stdafx.h" 


int _tmain(int argc, _TCHAR* argv[]) 



     printf("Hello "    "World!\n"); 


     char szSQL[1024]; 

     int iStuID = 10, 

         iClassID = 100; 


     sprintf(szSQL, 

         "Select * from Score where " 

         "StuID = %d" 

         "and ClassID =  %d\n", 

         iStuID, 

         iClassID 

         ); 


     printf(szSQL); 


     return 0; 





程序运行结果如下: 


Hello World! 

Select * from Score where StuID = 10and ClassID =  100 


从第二行输出结果,你看出什么来了么? 

#8


这是为什么

#9


for(int j=i-N;j<=N-i;printf("/n/n%d",N-abs(j++)));

#10


return 当然可以用
这是一道笔试题,要求
1 只能有1个语句,即一个分号
2 不能使用do while until goto for if关键字,不能使用?:和逗号运算符
3 唯一能使用的库函数为printf

#11


for(j=i;j<=n*2-1;printf("%d ",(j++)-(j>n)*(j-n)*2 ));

#12


1==>i

for(j=i;j<=n*2-i;printf("%d ",(j++)-(j>n)*(j-n)*2 ));

#13


逗号都不行?

#14


看来递归是不能用了,函数有2个参数,不能用逗号没发调用......

#15


for可以用吗?

#16


测试了一个可以输出:
1
2
3
4
5
6
7
的函数: 
int p(int i, int N)
{
printf("%d\n", i);
return (N>i) && (p(i+1,N));
}

#17


调试出了需要的功能的函数:
int p(int i, int N)
{
int x;
printf("%d\n", i);
return ( (N>i) && (p(i+1,N)) ) || ( (N>i) && p(i, i) );
}
输出:
1
2
3
4
5
6
7
6
5
4
3
2
1
i和N可以任取,但必须N>=i

#18


int x; 可以去掉,呵呵,调试留下的小尾巴!

#19


12楼和17楼的构思令我受益匪浅!

#20


回字的四种写法

#21


学习 强。。。。加油了。。。。

#22


17楼的可以简化、合并为一条语句:

int p(int i, int N) 

  return printf("%d\n", i) && (N>i) && (p(i+1,N) || p(i, i)); 

#23


引用 22 楼 logiciel 的回复:
17楼的可以简化、合并为一条语句:

C/C++ codeint p(int i,int N) 
{return printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 
}


引用 9 楼 的回复:
 for(int j=i-N;j <=N-i;printf("/n/n%d",N-abs(j++))); 
 


引用 12 楼  的回复:
1==>i 

for(j=i;j <=n*2-i;printf("%d ",(j++)-(j>n)*(j-n)*2 ));


学习了

#24


引用 22 楼 logiciel 的回复:
17楼的可以简化、合并为一条语句:

C/C++ codeint p(int i,int N) 
{return printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 
}

哇,太强了,真的可以简化!学习了!

#25


为什么printf有返回值我却从来都不懂,很惭愧啊!

#26


引用 17 楼 silitex 的回复:
调试出了需要的功能的函数:
 int p(int i, int N)
 {
  int x;
  printf("%d\n", i);
  return ( (N>i) && (p(i+1,N)) ) || ( (N>i) && p(i, i) );
 }
 输出:
 1
 2
 3
 4
 5
 6
 7
 6
 5
 4
 3
 2
 1
 i和N可以任取,但必须N>=i


这个确实实现了 能详细解释下吗?

#27


引用 22 楼 logiciel 的回复:
17楼的可以简化、合并为一条语句:

C/C++ codeint p(int i,int N) 
{return printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 
}

能解释下吗?

#28


学习中

#29


学习咯  !

#30


用这些递归会让时间复杂度提高,还不如写多几几条语句,现在的软件都是追求快,代码简化会付出太大的代价

#31


    能详细的解释下这句话的执行过程吗?
printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 

#32


return printf("%d\n", i) && (N>i) && (p(i+1,N) || p(i, i)); 
确实很强大。

#33


说一下我的理解:
当i<N时,执行p(i,N)
首先会输出i,
(判断条件N>i,可以保证在N>i时,执行后面的递归,N=i时只输出i,不可能将i增加到大于N的情况)
然后p(i+1,N)使和变量i依次增加1,直到i等于N时,只输出i,
后面的p(i,i),只是输出i,由于N>i为false,所以不执行后面的递归(p(i+1,N) || p(i, i))。
由于p(i+1,N)和p(i,i)是或的关系,所以只有当前者返回为false时,才会执行后者,所以输出的数字顺序为从i到N,再到i

#34


众人拾柴火焰高,一道题经过了大家辛苦的思考,得到了一个相当好的答案!这个帖子算是给我深有感悟啊!

#35


我的理解:
i 从 1到7 p函数共进栈6次,依次为p(2,7) p(3,7) p(4,7) p(5,7) p(6,7) p(7,7)

进栈函数均执行致 p(i+1,N),当i=7时(N>i)false,程序开始返回进栈函数

p(7,7)执行 p(i, i) 输出6 (i+1=7故i为6)

以下依次5 4 3 2 1

#36


什么意思啊

#37


学习     学习     还是学习

#38


太弓虽了

#39


太强了,我想不到,学习了

#40


如此一句容易理解
    return printf("%d\n", i) && (N>i) && (p(i+1,N) || printf("%d\n", i)&&false); 

#1


引用楼主 zxqwxyql 的回复:
写一个函数 int p(int i, int N);

能够输出i到N再到i,即以参数1,7调用函数,输出结果为

1

2

3

4

5

6

7

6

5

4

3

2

1

要求只用一个语句完成,不允许用?:等n多操作符和关键字。只能用一个printf库函数

一个语句?既然返回值是int,那必须得返回一个值吧,哪来其他语句printf

#2


这么有难度的题目多给点分数嘛

#3


除了?:和关键字,其他都可以用吗?

#4


原来return都不让用啊,太残忍了,我匿了....

#5


不明白为什么总要用这种无聊的限制来麻烦自己

#6


函数名: printf 
功  能: 产生格式化输出的函数 
用  法: int printf(char *format...); 
程序例: 

#include <stdio.h> 
#include <string.h> 

#define I 555 
#define R 5.5 

int main(void) 

   int i,j,k,l; 
   char buf[7]; 
   char *prefix = buf; 
   char tp[20]; 
   printf("prefix  6d      6o      8x        10.2e        " 
          "10.2f\n"); 
   strcpy(prefix,"%"); 
   for (i = 0; i < 2; i++) 
   { 
      for (j = 0; j < 2; j++) 
         for (k = 0; k < 2; k++) 
     for (l = 0; l < 2; l++) 
            { 
               if (i==0)  strcat(prefix,"-"); 
               if (j==0)  strcat(prefix,"+"); 
               if (k==0)  strcat(prefix,"#"); 
               if (l==0)  strcat(prefix,"0"); 
               printf("%5s |",prefix); 
               strcpy(tp,prefix); 
               strcat(tp,"6d |"); 
               printf(tp,I); 
               strcpy(tp,""); 
               strcpy(tp,prefix); 
               strcat(tp,"6o |"); 
               printf(tp,I); 
               strcpy(tp,""); 
               strcpy(tp,prefix); 
               strcat(tp,"8x |"); 
               printf(tp,I); 
               strcpy(tp,""); 
               strcpy(tp,prefix); 
        strcat(tp,"10.2e |"); 
        printf(tp,R); 
        strcpy(tp,prefix); 
        strcat(tp,"10.2f |"); 
        printf(tp,R); 
        printf("  \n"); 
        strcpy(prefix,"%"); 
     } 
       } 
   return 0; 


你可以研究一下是否可行。

#7


#include "stdafx.h" 


int _tmain(int argc, _TCHAR* argv[]) 



     printf("Hello "    "World!\n"); 


     char szSQL[1024]; 

     int iStuID = 10, 

         iClassID = 100; 


     sprintf(szSQL, 

         "Select * from Score where " 

         "StuID = %d" 

         "and ClassID =  %d\n", 

         iStuID, 

         iClassID 

         ); 


     printf(szSQL); 


     return 0; 





程序运行结果如下: 


Hello World! 

Select * from Score where StuID = 10and ClassID =  100 


从第二行输出结果,你看出什么来了么? 

#8


这是为什么

#9


for(int j=i-N;j<=N-i;printf("/n/n%d",N-abs(j++)));

#10


return 当然可以用
这是一道笔试题,要求
1 只能有1个语句,即一个分号
2 不能使用do while until goto for if关键字,不能使用?:和逗号运算符
3 唯一能使用的库函数为printf

#11


for(j=i;j<=n*2-1;printf("%d ",(j++)-(j>n)*(j-n)*2 ));

#12


1==>i

for(j=i;j<=n*2-i;printf("%d ",(j++)-(j>n)*(j-n)*2 ));

#13


逗号都不行?

#14


看来递归是不能用了,函数有2个参数,不能用逗号没发调用......

#15


for可以用吗?

#16


测试了一个可以输出:
1
2
3
4
5
6
7
的函数: 
int p(int i, int N)
{
printf("%d\n", i);
return (N>i) && (p(i+1,N));
}

#17


调试出了需要的功能的函数:
int p(int i, int N)
{
int x;
printf("%d\n", i);
return ( (N>i) && (p(i+1,N)) ) || ( (N>i) && p(i, i) );
}
输出:
1
2
3
4
5
6
7
6
5
4
3
2
1
i和N可以任取,但必须N>=i

#18


int x; 可以去掉,呵呵,调试留下的小尾巴!

#19


12楼和17楼的构思令我受益匪浅!

#20


回字的四种写法

#21


学习 强。。。。加油了。。。。

#22


17楼的可以简化、合并为一条语句:

int p(int i, int N) 

  return printf("%d\n", i) && (N>i) && (p(i+1,N) || p(i, i)); 

#23


引用 22 楼 logiciel 的回复:
17楼的可以简化、合并为一条语句:

C/C++ codeint p(int i,int N) 
{return printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 
}


引用 9 楼 的回复:
 for(int j=i-N;j <=N-i;printf("/n/n%d",N-abs(j++))); 
 


引用 12 楼  的回复:
1==>i 

for(j=i;j <=n*2-i;printf("%d ",(j++)-(j>n)*(j-n)*2 ));


学习了

#24


引用 22 楼 logiciel 的回复:
17楼的可以简化、合并为一条语句:

C/C++ codeint p(int i,int N) 
{return printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 
}

哇,太强了,真的可以简化!学习了!

#25


为什么printf有返回值我却从来都不懂,很惭愧啊!

#26


引用 17 楼 silitex 的回复:
调试出了需要的功能的函数:
 int p(int i, int N)
 {
  int x;
  printf("%d\n", i);
  return ( (N>i) && (p(i+1,N)) ) || ( (N>i) && p(i, i) );
 }
 输出:
 1
 2
 3
 4
 5
 6
 7
 6
 5
 4
 3
 2
 1
 i和N可以任取,但必须N>=i


这个确实实现了 能详细解释下吗?

#27


引用 22 楼 logiciel 的回复:
17楼的可以简化、合并为一条语句:

C/C++ codeint p(int i,int N) 
{return printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 
}

能解释下吗?

#28


学习中

#29


学习咯  !

#30


用这些递归会让时间复杂度提高,还不如写多几几条语句,现在的软件都是追求快,代码简化会付出太大的代价

#31


    能详细的解释下这句话的执行过程吗?
printf("%d\n", i)&& (N>i)&& (p(i+1,N)|| p(i, i)); 

#32


return printf("%d\n", i) && (N>i) && (p(i+1,N) || p(i, i)); 
确实很强大。

#33


说一下我的理解:
当i<N时,执行p(i,N)
首先会输出i,
(判断条件N>i,可以保证在N>i时,执行后面的递归,N=i时只输出i,不可能将i增加到大于N的情况)
然后p(i+1,N)使和变量i依次增加1,直到i等于N时,只输出i,
后面的p(i,i),只是输出i,由于N>i为false,所以不执行后面的递归(p(i+1,N) || p(i, i))。
由于p(i+1,N)和p(i,i)是或的关系,所以只有当前者返回为false时,才会执行后者,所以输出的数字顺序为从i到N,再到i

#34


众人拾柴火焰高,一道题经过了大家辛苦的思考,得到了一个相当好的答案!这个帖子算是给我深有感悟啊!

#35


我的理解:
i 从 1到7 p函数共进栈6次,依次为p(2,7) p(3,7) p(4,7) p(5,7) p(6,7) p(7,7)

进栈函数均执行致 p(i+1,N),当i=7时(N>i)false,程序开始返回进栈函数

p(7,7)执行 p(i, i) 输出6 (i+1=7故i为6)

以下依次5 4 3 2 1

#36


什么意思啊

#37


学习     学习     还是学习

#38


太弓虽了

#39


太强了,我想不到,学习了

#40


如此一句容易理解
    return printf("%d\n", i) && (N>i) && (p(i+1,N) || printf("%d\n", i)&&false);