[c/c++奇技淫巧]不用循环判断输出5到1

偶尔看到的一道题,和哥们几个讨论了一下,这玩意,不是循环就是递归了么,当然,只要达到目的,管他什么循环递归,对吧。现在总结一下我们能想到的所有的方法,大家有新的想法欢迎跟帖讨论~~

ok,开工。

第一条,最简单的,直接输出。(因为输出结果都差不多,就不一个一个截图了)

printf("5 4 3 2 1\n");

第二条,简单的循环。

 // for 循环
 for(int =5; i !=0; i--) {
     printf("%d\n",i);
 }  
 
 // while 循环
 int i=6;
 while(--i){
     printf("%d\n",i);
 }
 
 // do while 循环
 int i=5;
 do{
     prinf("%d\n",i);
 }while(--i);

三,递归。现在基本循环是讲完了,来讨论一下递归吧,先来个简单点的。

#include <stdio.h>
void print(int i)
{
    if(i){
    printf("%d\n",i);
    print(--i);
    }
}
int main()
{
    print(5);
    return 0;
}

然后另一哥们呵呵一笑,来了个短路递归。

#include <stdio.h>
int print(int n)
{
    printf("%d\n",n);
    --n && print(n);
}
int main()
{
    print(5);
    return 0;
}

四,c++上场。群里有个用c++的哥们不服了,也来了一段类的构造。

// c++ 
#include <iostream>
class A{
public :
    static int n;
    A(){std::cout<<n--<<std::endl;}
};
int A::n=5;
int main()
{
    new A[5];
    return 0;
}

版主说你们这群渣渣,看哥儿给你们耍耍模版。

#include <iostream>
using namespace std;
template <int T>
class F: public F<T+1> {
public:
   F(){cout << T << " ";}
};
template <>
class F<6> {
};
int main()
{
        F<1> fu;
        cout<<endl;
        return 0;
}

五,递归从新归来。看大家这么热闹,我也想写一个,但是c++又不熟练,突然想起gcc的一个特性,main也可以递归啊

// gcc 通过,vs不行,clang 报两个警告
#include <stdio.h>
#include <stdlib.h>
void main(int i) {
  printf("%d\n", 6-i);
  (&main + (&exit - &main)*(i/5))(i+1);
}

六、汇编+开挂。然后一个汇编大牛说话了,你们BB什么,哥儿写的代码你们都看不懂,然后洋气的甩我们一张截图。

// 这个在gcc下编译失败
#include "stdio.h"
int main(){
  __asm{
  push esi
  mov esi,0x31
buhaha:
  push esi
  call putchar
  push 0x0a
  call putchar
  add esp,8
  inc esi
  cmp esi,0x36
  jne buhaha
  pop esi
  }
  return 0;
}

我们一致讨论说这个算开挂,不能作数,大神不耐烦又补上两行代码

这下大家都没话说了。。。。。

你以为这就完了,当然没有,

我们还没反应过来,大神又说话了,哥儿不用汇编也能开挂,呵呵。

// gcc 下编译成功,运行出现段错误
#include <stdio.h>
typedef void (*hehe)();
int main(){
static char a[]={0x56, 0x57, 0xBF, 0x78, 0x56, 0x34, 0x12, 0xBE, 0x31, 0x00,0x00, 0x00, 0x56, 0xFF, 0xD7, 0x6A, 0x0A, 0xFF, 0xD7, 0x83,0xC4, 0x08, 0x46, 0x83, 0xFE, 0x36, 0x75, 0xF0, 0x5F, 0x5E, 0xC3};
    *(unsigned long *)(&a[3])=(unsigned long)putchar;
    ((hehe)(&a[0]))();
}

大家都不说话了。。。。。。

总结:说了这么多c/c++的方法,其他语言肯定也有更“变态”的方法,平时遇到一个问题时可能我们一个人思路有限,但是和大伙交流一下,总能有各种各样的解决方案,所以,不要吝啬你们的解题方法,拿出来大家交流一下吧 :)

时间: 2024-12-21 09:44:05

[c/c++奇技淫巧]不用循环判断输出5到1的相关文章

c语言:不用if,else语句,也不用循环条件等,输入一个字符,判断是否为大写字母

不用if,else语句,也不用循环条件等,输入一个字符,判断是否为大写字母,如果是,就转换成小写字母:否则不转换.最后输出得到的这个字符. 程序: #include<stdio.h> int main() { char ch; printf("请输入一个字符:"); scanf("%c",&ch); ch = (ch >= 'A'&&ch <= 'Z') ? (ch + 32) : ch; printf("%

Python条件循环判断

1.条件判断语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: 1 2 3 4 5 6 7 8 9 age_of_cc = 27 age = int(input("guessage:")) if age == age_of_cc:     print("Yes,you got it!") elif age > age_of_cc:     print("猜大啦!") else:     prin

一个整数,大于0,不用循环和本地变量,按照 n, 2n, 4n, 8n 的顺序递增,当值大于5000 时,把值按照指定顺序输出来。

1 package sfbc; 2 /** 3 * 一个整数,大于0,不用循环和本地变量,按照 n, 2n, 4n, 8n 的顺序递增,当值大于5000 4 时,把值按照指定顺序输出来. 5 例: n=1237 6 则输出为: 7 1237, 8 2474, 9 4948, 10 9896, 11 9896, 12 4948, 13 2474, 14 1237, 15 提示:写程序时,先致谢按递增方式的代码,写好递增的以后,再增加考虑递减部分. 16 * @author trfizeng 17

shell文本过滤编程(六):awk之循环判断及数组

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 与上一节printf一样,awk的循环判断和C语言的循环判断语法极其类似. 1. While循环 #!/bin/sh awk ' BEGIN { ORS="" } { i=0 while (i < NF) { printf("* ") i++ } print "\n" } ' group_file1 首先,

while循环,格式化输出%,运算符,数据类型的转换,编码的初识,

while 循环 where:程序中:你需要重复之前的动作,输入用户名密码时,考虑到while循环. what:while 无限循环. how: 基本结构: while 条件: 循环体 初识循环 while True: print('狼的诱惑') print('我们不一样') print('月亮之上') print('庐州月') print('人间') 循环如何终止?--3种 改变条件. flag = True #flag标志位 while flag: print('狼的诱惑') print('

【C语言】用循环语句输出菱形

//用循环语句输出菱形 #include <stdio.h> int main() { int i,j; for(i=0;i<=3;i++) //上4行 { for(j=0;j<=3;j++) //上4行的左边 { if(i+j<=2) printf(" "); else printf("*"); } for(j=4;j<=6;j++) //上4行的右边 { if(j-i>=4) printf(" ");

不用循环,不用递归,从1打印到100

如果不用循环.递归.goto,如何才能用 C++ 从 1 打印到 100 ? 看到这样一篇文章.上面有很多种解法,下面介绍几个好理解一点的: 第一种:在代码中执行系统指令 #include <stdlib.h> int main() {   return system("seq 1 100"); } 第二种:利用信号捕捉 #include <stdio.h> #include <stdlib.h>   #include <unistd.h>

【JSP EL】EL表达式 获取list长度/不用循环,EL在List中直接获取第一项的内容/EL获取Map的键,Map的值

1.EL表达式 获取list长度 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <c:if test="${fn:length(list名字)>1}"&g

C++学习笔记:不用sizeof判断int类型占用几个字节

#include <stdio.h> #include <string.h> char *change(int val, int base, char *retbuf) { static const char *str = "0123456789ABCDEF"; char *p; char buf[15]; p = buf+14; *p = 0; do { *--p = str[val % base]; } while( val /= base ); strcp