不要写1000次printf语句
老外 搞过这个讨论 用c++ 模版编译器预处理 居多 呵呵:)
贴几个别人写的代码:例子1
template<int N> void f1(){f1<N-1>();cout << N << 'n';}
template<> void f1<1>(){cout << 1 << 'n';}
// short circuiting (not a conditional statement)void f2(int N){N && (f2(N-1), cout << N << 'n');}
// constructors!struct A {A() {static int N = 1;cout << N++ << 'n';}};
int main(){f1<1000>();f2(1000);delete[] new A[1000]; // (3)A data[1000]; // (4) added by Martin York}
例子2
#include <iostream>template<int N>struct NumberGeneration{static void out(std::ostream& os){NumberGeneration<N-1>::out(os);os << N << std::endl;}};template<>struct NumberGeneration<1>{static void out(std::ostream& os){os << 1 << std::endl;}};int main(){NumberGeneration<1000>::out(std::cout);}
例子3
#include <stdio.h>#define MAX 1000int boom;int foo(n) {boom = 1 / (MAX-n+1);printf("%dn", n);foo(n+1);}int main() {foo(1);}
我再补充两个答案
#include <stdio.h>#include <stdlib.h>
void main(int j) {printf("%dn", j);(&main + (&exit - &main)*(j/1000))(j+1);}
#include <stdio.h>int i = 0;p() { printf("%dn", ++i); }a() { p();p();p();p();p(); }b() { a();a();a();a();a(); }c() { b();b();b();b();b(); }main() { c();c();c();c();c();c();c();c(); return 0; }
最简单的。。。goto
shell的 seq 可以做
#include <iostream>#include <iterator>#include <vector>#include <numeric>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ostream_iterator<int> it(cout," ");vector<int> xxx(1000,1);partial_sum(xxx.begin(),xxx.end(),it);getchar();return 0;}
最朴素的想法就是直接打印出来,但是1000条打印代码的写法被出题者禁止,所以自然变通的方法是函数调用,上面有个哥们提到了递归,但是递归函数是一定要有结束条件判断的,不然就是无限循环了。所以可以考虑用二进制编码单位去构造基础函数,具体方法如下:
p512(1);p256(513);p128(770);p64(899);p32(964);p4(997);
void p512(int a){p256(a);p256(a+256);}
...
void p2(int a){p1(a);p1(a+1);}
void p1(int a){printf("%d ", a);}
说明:上面函数 pm(n)的定义是从n开始连续打印m个整数。只所以用这种方式而不是写成p(m, n)的递归函数定义方式是因为停止条件是要进行判断的。
是在编译器输出还是在运行期输出?如果是编译器的话Thomas说的就是了,如果要求运行期输出,那么可以递归函数实现
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有一天你能到我的心里去,你会看到那里全是你给的伤悲。
文章 0 评论 0
接受
发布评论
评论(7)
老外 搞过这个讨论 用c++ 模版
编译器预处理 居多 呵呵:)
贴几个别人写的代码:
例子1
template<int N> void f1()
{
f1<N-1>();
cout << N << 'n';
}
template<> void f1<1>()
{
cout << 1 << 'n';
}
// short circuiting (not a conditional statement)
void f2(int N)
{
N && (f2(N-1), cout << N << 'n');
}
// constructors!
struct A {
A() {
static int N = 1;
cout << N++ << 'n';
}
};
int main()
{
f1<1000>();
f2(1000);
delete[] new A[1000]; // (3)
A data[1000]; // (4) added by Martin York
}
例子2
#include <iostream>
template<int N>
struct NumberGeneration{
static void out(std::ostream& os)
{
NumberGeneration<N-1>::out(os);
os << N << std::endl;
}
};
template<>
struct NumberGeneration<1>{
static void out(std::ostream& os)
{
os << 1 << std::endl;
}
};
int main(){
NumberGeneration<1000>::out(std::cout);
}
例子3
#include <stdio.h>
#define MAX 1000
int boom;
int foo(n) {
boom = 1 / (MAX-n+1);
printf("%dn", n);
foo(n+1);
}
int main() {
foo(1);
}
我再补充两个答案
#include <stdio.h>
#include <stdlib.h>
void main(int j) {
printf("%dn", j);
(&main + (&exit - &main)*(j/1000))(j+1);
}
#include <stdio.h>
int i = 0;
p() { printf("%dn", ++i); }
a() { p();p();p();p();p(); }
b() { a();a();a();a();a(); }
c() { b();b();b();b();b(); }
main() { c();c();c();c();c();c();c();c(); return 0; }
最简单的。。。goto
shell的 seq 可以做
#include <iostream>
#include <iterator>
#include <vector>
#include <numeric>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ostream_iterator<int> it(cout," ");
vector<int> xxx(1000,1);
partial_sum(xxx.begin(),xxx.end(),it);
getchar();
return 0;
}
最朴素的想法就是直接打印出来,但是1000条打印代码的写法被出题者禁止,所以自然变通的方法是函数调用,上面有个哥们提到了递归,但是递归函数是一定要有结束条件判断的,不然就是无限循环了。所以可以考虑用二进制编码单位去构造基础函数,具体方法如下:
p512(1);
p256(513);
p128(770);
p64(899);
p32(964);
p4(997);
void p512(int a){
p256(a);
p256(a+256);
}
...
void p2(int a){
p1(a);
p1(a+1);
}
void p1(int a){
printf("%d ", a);
}
说明:上面函数 pm(n)的定义是从n开始连续打印m个整数。只所以用这种方式而不是写成
p(m, n)的递归函数定义方式是因为停止条件是要进行判断的。
是在编译器输出还是在运行期输出?如果是编译器的话Thomas说的就是了,如果要求运行期输出,那么可以递归函数实现