루프 또는 조건부없이 1 ~ 1000 인쇄


323

작업 : 루프 나 조건문을 사용하지 않고 1에서 1000 사이의 숫자를 인쇄합니다. printf()or cout문을 1000 번만 쓰지 마십시오 .

C 또는 C ++를 사용하여 어떻게 하시겠습니까?


137
대답은 500 printf번의 전화를 사용 하고 매번 두 개의 숫자를 인쇄하는 것입니다.
James McNellis

433
printf ( "1부터 1000까지의 숫자");
jondavidjohn

7
:?조건없는 문은 (는 식이다) ...
크리스 루츠

127
인터뷰 기회가 빛납니다. "루프 나 조건부없이? 어린이 놀이. 컴퓨터 없이도 할 수 있습니다!" 그런 다음 펜과 메모장을 꺼냅니다. 혼란스러워 보일 수도 있지만 내장 언어 구성에 의존 할 수 없다면 실제로 아무것도 가정 할 수 없다고 설명하십시오.
JohnFx

8
개인적으로, 나는 영리하고 흥미로운 해결책을 가진 몇 가지 답변이 있다고 생각합니다. 또한 이것은 인터뷰가 쉽게 끔찍한 인터뷰 질문이 될 수 있지만, 인터뷰 대상자가 인터뷰 대상이 나타내는 접근법을 고려했는지 여부를 찾는 것만 큼 완전히 정형화 된 솔루션을 실제로 찾지 않는 한 좋은 가치가있을 수 있다고 생각합니다. TMP에 대한 지식 또는 비정상적인 방식으로 구조물 사용. 이것이 순수한 '올바른 / 잘못 된'질문으로 사용된다면 나쁘다고 생각하지만 토론의 시작점으로 사용되면 많은 가치를 볼 수 있습니다.
Michael Burr

답변:


785

컴파일 시간 재귀! :피

#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);
}

8
누군가 이것이 어떻게 작동하는지 설명 할 수 있습니까? 꽤 인상적입니다.
gath

28
@Zack : 현실화하자, 우리는 의도적으로 루프를 피하기 위해 작성된 프로그램에서 1,000 줄을 인쇄하고있다. 성능은 문제가되지 않습니다.
dreamlax

42
이것을 컴파일 할 정도로 호기심 많은 사람들을 위해 : g ++에서 -ftemplate-depth-1000을 설정하십시오. 기본 템플릿 재귀 최대 값은 500입니다.
Tom

6
이것은 여전히 ​​조건을 사용합니다 : 패턴 일치는 영광입니다.
David K.

10
@dreamlax : 내가 지난 몇 년 동안의 경험에서 배운 것들 중 하나입니다 : 사용 '\n'당신이 정말로, 세척에 사용을 원하지 않는다면 ++i당신은 실제로의 이전 값을 필요로하지 않는 한 i통과, const당신이하지에 좋은 이유가없는 한 참조 ... 개발자가 이것에 대해 생각하지 않으면 (또는 시작조차하지 않음) 조만간이 문제가 중요한 문제가 발생하지만 중요한 부분 만 알지 못했을 것입니다.
sbi

1195

이것은 실제로 조건이없는 어셈블리로 컴파일됩니다.

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&main + (&exit - &main)*(j/1000))(j+1);
}


편집 : 주소를 고려하여 포인터 오류를 피하기 위해 '&'를 추가했습니다.

표준 C에서 위 버전은 함수 포인터에 대한 산술에 의존하지 않기 때문에 다음과 같습니다.

#include <stdio.h>
#include <stdlib.h>

void f(int j)
{
    static void (*const ft[2])(int) = { f, exit };

    printf("%d\n", j);
    ft[j/1000](j + 1);
}

int main(int argc, char *argv[])
{
    f(1);
}

17
이 답변의 코드는 분명히 C 나 C ++이 아니므로 요구 사항을 폐기하는 경우에만 좋습니다. 그러면 가상 컴파일러가 모든 입력에서 필요한 프로그램을 생성 할 수 있기 때문에 모든 대답이 적합 할 수 있습니다.
eq-

321
@PP는 설명하기에 꽤 길지만 기본적으로 j초기에는 1실제로 프로그램 이기 때문에 인수없이 호출 argc되는 1경우입니다. 그런 다음 j/1000입니다 0때까지 j이된다 1000그것의 후, 1. (exit - main)물론,,의 주소의 차이 exit()main(). 즉 (main + (exit - main)*(j/1000))이다 main()까지 j해진다 1000는 해지는 후에 exit(). 최종 결과는 main()프로그램이 시작될 때 호출 된 j다음 증가하는 동안 재귀 적으로 999 번 호출 한 다음을 호출하는 것 exit()입니다. Whew :)
프레데릭 하 미디

7
이것은 CI의 가장 놀라운 남용 중 하나입니다. 그러나 모든 플랫폼에서 작동합니까?
Qwertie

13
@ Mark : 이것은 main의 표준 서명이 아니며 main을 재귀 적으로 호출하는 것이 허용되지 않으며 함수 포인터를 빼는 결과는 정의되지 않습니다.
Yakov Galka

9
예, 그렇습니다. @ ybungalobill 이주는 이유 때문에 엄격하게 합법적 인 C ++ 코드는 아니지만 약간의 광기 및 몇 가지 플랫폼에서 컴파일되고 작동한다는 사실을 +1해야합니다. "그러나 그것은 표준이 아닙니다!"에 대한 올바른 응답 일 때가 있습니다. "누가 신경 쓰는지!" :)
j_random_hacker 8

544
#include <stdio.h>
int i = 0;
p()    { printf("%d\n", ++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; }

아무도 이것을 게시하지 않은 것 같습니다. 가장 확실한 방법이라고 생각했습니다. 1000 = 5*5*5*8.


사람들이 이것을 게시했습니다. 다른 버전은 전역을 사용하는 대신 인쇄 할 번호를 전달하지만 본질적으로 동일한 솔루션입니다.
크리스 루츠

1
@Chris, 그들은 매크로 나 템플릿으로 표현 된 것과 같은 논리를 사용하여 코드 크기를 날려 버립니다. 수천 개의 printfs 대신 출력 문자열 자체를 생성 할 수도 있습니다.
다리우스 베이컨

그래, Keith의 대답이 전체 문자열을 멋지게 생성한다는 것을 알았다. :) 나는 그것을 놓쳤다.
다리우스 베이컨

43
음, 좋은 노력하지만 2 * 2 * 2로 분해되어 8하지 않았다 때문에 고유 한 주요 인수 분해 사용하는 것이 오히려 이상한
데이비드 헤퍼 넌

298

루프를 사용할 필요가없는 것 같습니다

printf("1 10 11 100 101 110 111 1000\n");

1
사용 copy이 부정 행위 라고 주장 할 수도 있습니다
John

13
@Johannes 실제로 나는 확실히 printf루프가 있다고 확신 합니다 : p
icecrime

1
@litb : "사용 copy 부정 행위" 라고 말하지 않았 음
John Dibling

2
@ 존 : 복사 부정 행위입니다. 당신은 그것을 의심합니까? : P
Nawaz

1
1에서 10까지의 규모로 바이너리를 사용할 확률은 얼마입니까?
Jordan

270

내가 아는 세 가지 솔루션이 있습니다. 두 번째는 논쟁의 여지가 있습니다.

// compile time recursion
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
}

[ Edit : (1) 및 (4)는 컴파일 시간 상수에만 사용할 수 있으며 (2) 및 (3)은 런타임 표현식에도 사용할 수 있습니다 . 편집을 종료합니다. ]


5
또한 단락이 조건부가 아닌 것에 대해 논쟁하고 싶습니다 ... 성명서가 아니라 조건부 표현이라고 말하고 싶습니다. 조건식을 "어셈블러에서 조건부 점프를 생성하는 것"으로 정의한 경우.
Kos

5
생성자 하나를 읽을 때 나를 때리는 질문 : 표준은 배열의 각 항목을 순서대로 구성해야합니까? 생성자가 부작용이 있는지 여부는 중요합니다. 모든 제정신 컴파일러가 이것을 0-> 1000 루프로 구현한다고 확신하지만, 여전히 순응하고 역순으로 루프 할 수 있는지 궁금합니다 ...
Joseph Garvin

6
@Joseph-생성자는 개별 객체의 시작 순서에 영향을받지 않아야하지만 좋은 질문입니다.
크리스 루츠

12
@Joseph 이것은 12.6 / 3 (C ++ 03)에 의해 정의됩니다. 초기화는 구독 순서로 수행됩니다.
요하네스 샤 우브-litb

2
@Joseph : 그리고 그것들은 역순으로 파괴되기 때문에, 당신은 쉽게 파괴자를 사용할 수 있습니다 :)
j_random_hacker

263

printf 문을 1000 번 작성하지 않았습니다!

printf("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n501\n502\n503\n504\n505\n506\n507\n508\n509\n510\n511\n512\n513\n514\n515\n516\n517\n518\n519\n520\n521\n522\n523\n524\n525\n526\n527\n528\n529\n530\n531\n532\n533\n534\n535\n536\n537\n538\n539\n540\n541\n542\n543\n544\n545\n546\n547\n548\n549\n550\n551\n552\n553\n554\n555\n556\n557\n558\n559\n560\n561\n562\n563\n564\n565\n566\n567\n568\n569\n570\n571\n572\n573\n574\n575\n576\n577\n578\n579\n580\n581\n582\n583\n584\n585\n586\n587\n588\n589\n590\n591\n592\n593\n594\n595\n596\n597\n598\n599\n600\n601\n602\n603\n604\n605\n606\n607\n608\n609\n610\n611\n612\n613\n614\n615\n616\n617\n618\n619\n620\n621\n622\n623\n624\n625\n626\n627\n628\n629\n630\n631\n632\n633\n634\n635\n636\n637\n638\n639\n640\n641\n642\n643\n644\n645\n646\n647\n648\n649\n650\n651\n652\n653\n654\n655\n656\n657\n658\n659\n660\n661\n662\n663\n664\n665\n666\n667\n668\n669\n670\n671\n672\n673\n674\n675\n676\n677\n678\n679\n680\n681\n682\n683\n684\n685\n686\n687\n688\n689\n690\n691\n692\n693\n694\n695\n696\n697\n698\n699\n700\n701\n702\n703\n704\n705\n706\n707\n708\n709\n710\n711\n712\n713\n714\n715\n716\n717\n718\n719\n720\n721\n722\n723\n724\n725\n726\n727\n728\n729\n730\n731\n732\n733\n734\n735\n736\n737\n738\n739\n740\n741\n742\n743\n744\n745\n746\n747\n748\n749\n750\n751\n752\n753\n754\n755\n756\n757\n758\n759\n760\n761\n762\n763\n764\n765\n766\n767\n768\n769\n770\n771\n772\n773\n774\n775\n776\n777\n778\n779\n780\n781\n782\n783\n784\n785\n786\n787\n788\n789\n790\n791\n792\n793\n794\n795\n796\n797\n798\n799\n800\n801\n802\n803\n804\n805\n806\n807\n808\n809\n810\n811\n812\n813\n814\n815\n816\n817\n818\n819\n820\n821\n822\n823\n824\n825\n826\n827\n828\n829\n830\n831\n832\n833\n834\n835\n836\n837\n838\n839\n840\n841\n842\n843\n844\n845\n846\n847\n848\n849\n850\n851\n852\n853\n854\n855\n856\n857\n858\n859\n860\n861\n862\n863\n864\n865\n866\n867\n868\n869\n870\n871\n872\n873\n874\n875\n876\n877\n878\n879\n880\n881\n882\n883\n884\n885\n886\n887\n888\n889\n890\n891\n892\n893\n894\n895\n896\n897\n898\n899\n900\n901\n902\n903\n904\n905\n906\n907\n908\n909\n910\n911\n912\n913\n914\n915\n916\n917\n918\n919\n920\n921\n922\n923\n924\n925\n926\n927\n928\n929\n930\n931\n932\n933\n934\n935\n936\n937\n938\n939\n940\n941\n942\n943\n944\n945\n946\n947\n948\n949\n950\n951\n952\n953\n954\n955\n956\n957\n958\n959\n960\n961\n962\n963\n964\n965\n966\n967\n968\n969\n970\n971\n972\n973\n974\n975\n976\n977\n978\n979\n980\n981\n982\n983\n984\n985\n986\n987\n988\n989\n990\n991\n992\n993\n994\n995\n996\n997\n998\n999\n1000\n");

천만에요 ;)


223
해당 라인을 생성하는 프로그램을 작성했으면합니다.
Martin York

32
open ( "1000.c", 'w'). write ( 'printf ( "% s");'% ( "\ n".join (xrange (1,1000)에서 x의 경우 str (x)) ))
Tyler Eaves

53
해당 줄을 생성하기 위해 작성한 프로그램에 루프가 포함되어 있지 않기를 바랍니다.
Kim Jeeyoung

20
Vim 매크로는 빠르게 작업을 수행합니다.
StackedCrooked

2
약간의 Perl이 그것을 멋진 방식으로 생성합니다 :$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
sidyll

213
printf("%d\n", 2);
printf("%d\n", 3);

이 인쇄되지 않습니다 모든 숫자를하지만, "1에서 1000 번호를 인쇄"않습니다 승리에 대한 모호한 질문! :)


77
'printf ( "1에서 1000까지의 숫자")'다음에 내가 가장 좋아하는 것은-어리석은 질문에는 어리석은 대답이 필요합니다.
SEngstrom

대단해. 질문의 모호성을 이용하여 +1. haha
Nawaz

2
편집; 어떤 식 으로든, 모양이나 형태로이 코드를 수행하지 않았습니다 print "Print numbers from 1 to 1000.". 승리에 대한 모호한 질문, 부정확 한 설명 suck :)
sehe

와우, 최근 에이 질문에 대한 답변에 약간의 기물 파손이있었습니다. 그 자물쇠를 역사적 자물쇠로 업그레이드해야한다고 말해줍니다.
BoltClock

172

치명적인 오류를 유발하십시오! 다음은 countup.c 파일입니다.

#include <stdio.h>
#define MAX 1000
int boom;
int foo(n) {
    boom = 1 / (MAX-n+1);
    printf("%d\n", n);
    foo(n+1);
}
int main() {
    foo(1);
}

컴파일 한 다음 쉘 프롬프트에서 실행하십시오.

$ ./countup
1
2
3
...
996
997
998
999
1000
Floating point exception
$

이것은 실제로 루프 또는 조건없이 1에서 1000까지의 숫자를 인쇄합니다!


43
fflush (stdout)를 호출해야합니다. 각 printf () 후에 ... 프로그램이 충돌 할 때 출력 버퍼가 화면에 인쇄되는 것은 아닙니다.
zakk

10
@zakk : 꼭 필요한 것은 아닙니다. 기본적으로 stdout은 라인 버퍼링되므로 \n출력을 플러시하기에 충분합니다.
psmears

24
stdout은 대화식 장치로 결정될 수있는 경우 라인 버퍼링 되며 그렇지 않으면 완전히 버퍼링됩니다. 교수가 자동 검사를 위해 파일로 stdout을 리디렉션하면 실패합니다 :-)
paxdiablo

(임베디드 환경에서 예) 유래의 위험
헤르 Eche

166

시스템 명령 사용

system("/usr/bin/seq 1000");

15
높은 기회 /usr/bin/seq는 내부적으로 루프를 사용합니다. :)

@jokester : Solaris / BSD에는 seq유틸리티 가 없기 때문에 (기본 설정)? <grin />
sehe

나는 이것을 말하기를 싫어하지만 (잘 모르겠다), 솔루션에 버그가있다. 올바른 숫자 세트를 인쇄하지 않습니다. :) 여기에 수정이다 : system("/bin/echo {1..1000}"); 당신은 ... 먼저 단위 테스트를 작성했다 경우에만
돈 브랜슨

1
어떤 밝은 친구가 내 대답을 변경하기로 결정했기 때문에 그것은 내 실수가 아닙니다.
moinudin 2010

100

테스트되지 않았지만 바닐라 표준 C 여야합니다.

void yesprint(int i);
void noprint(int i);

typedef void(*fnPtr)(int);
fnPtr dispatch[] = { noprint, yesprint };

void yesprint(int i) {
    printf("%d\n", i);
    dispatch[i < 1000](i + 1);
}

void noprint(int i) { /* do nothing. */ }

int main() {
    yesprint(1);
}

29
@Prasoon : 관계입니다.
Yakov Galka

28
요구 사항은 "조건부 없음"입니다 (있는 경우, 스위치 등). "조건 없음"이 아닌
jon_darkstar

32
<조건이 아닙니다. 관계 연산자입니다. if/ else는 조건문입니다. ?:조건부 연산자입니다. <부울 값을 반환하는 연산자 일뿐입니다. 아마도 점프 또는 아무것도없는 단일 기계 명령 일 것입니다.
Chris Lutz

12
@ 크리스 루츠 : 86에, 그것은 3 개 지침을이다 : cmpl, setle,와 movzbl. x86-64는 더하기 a cltq입니다. PowerPC는 2 명령어입니다 : cmpwicrnot.
Adam Rosenfield

4
1 - i / 1000. 비교가 없습니다!
Thai

96

여기 다른 사람들에 비해 조금 지루하지만 아마도 그들이 찾고있는 것입니다.

#include <stdio.h>

int f(int val) {
    --val && f(val);
    return printf( "%d\n", val+1);
}

void main(void) {
    f(1000);
}

더 짧게 만들었습니다. i를 main 외부와 main 내부로 설정 : printf ( "% d \ n", 11-i) && --i && main (i);
jftuga

3
@Jens Schauder : &&의 첫 번째 줄에서 지연 평가 를 활용 f()합니다.
Rafał Dowgird

10
지루하지 않습니다. 간단합니다. 템플릿 마법의 큰 혼란으로 할 수있는 것과 같이 짧은 기능으로 동일한 작업을 수행 할 수 있다면 다음 기능으로 수행해야합니다 :)
amertune

21
&&는 조건부입니다. 수학 AND는 양쪽 모두를 평가합니다 (Java 및 Ada "AND"와 같이). &&는 첫 번째가 참인 경우 에만 두 번째 연산자를 평가 합니다. 또는 다른 예 : Ada에서는 단락 연산자를 "OR THEN"이라고 부릅니다. THEN을 사용하여 조건부 측면을 나타냅니다. 죄송합니다. : 운영자.
Martin

사과 할 필요가 없습니다. &&는 비교 연산자입니다. 삼항 연산자는 조건부입니다.
Aaron

71

이 작업은 프로그램이 1000 후에 종료되어야한다고 지정하지 않았습니다.

void f(int n){
   printf("%d\n",n);
   f(n+1);
}

int main(){
   f(1);
}

( 추가 매개 변수없이 ./a.out을 실행하면이를 단축 할 수 있습니다 )

void main(int n) {
   printf("%d\n", n);
   main(n+1);
}

그러나 1000에서 멈추지 않습니다. 계속 진행됩니다.
레미 레보

C 또는 C ++ 요구 사항을 폐기 한 경우에만 단축 할 수 있습니다. 그런 다음 이론적 인 컴파일러가 원하는 입력을 모든 프로그램에서 생성 할 수 있기 때문에 "프로그램"이 수행됩니다.
eq-

@eq 다시, 이것은 컴파일하고 잘 작동합니다…
Mark McDonald

72
나중에 생각할 때 : 명백한 수학을 피할 수도 있습니다 . 우리가 고용한다면 rand(), 우리는 1에서 1000 사이의 모든 숫자를 인쇄 할 것입니다. 결국 = : P

5
@pooh : rand ()가 특정 시퀀스 이후에 반복 될 가능성이 있기 때문에 반드시 그럴 필요는 없으며,이 시퀀스는이 문제에 대한 솔루션 세트에 포함되지 않을 수 있습니다.
dchhetri

71

파이처럼 쉬워요! :피

#include <iostream>

static int current = 1;

struct print
{
    print() { std::cout << current++ << std::endl; }
};

int main()
{
    print numbers [1000];
}

그렇지 않으면 "static int current = 0"을 원할 수 있습니다. 그렇지 않으면 2에서 1001까지 인쇄됩니다.
Shinnok

++ current를 current ++로 변경했습니다
Zelix

65
#include <stdio.h>
#define Out(i)       printf("%d\n", i++);
#define REP(N)       N N N N N N N N N N
#define Out1000(i)   REP(REP(REP(Out(i))));
void main()
{
 int i = 1;
 Out1000(i);
}

3
음 매크로. 저녁은 뭐에요?
EvilTeach

42

우리는 1000 개의 스레드를 시작할 수 있으며 각 스레드는 숫자 중 하나를 인쇄합니다. OpenMPI를 설치 mpicxx -o 1000 1000.cpp하고를 사용하여 컴파일 하고 실행하십시오 mpirun -np 1000 ./1000. limit또는을 사용하여 설명자 제한을 늘려야 할 수도 ulimit있습니다. 코어가 많지 않으면 속도가 느려집니다.

#include <cstdio>
#include <mpi.h>
using namespace std;

int main(int argc, char **argv) {
  MPI::Init(argc, argv);
  cout << MPI::COMM_WORLD.Get_rank() + 1 << endl;
  MPI::Finalize();
}

물론 숫자가 반드시 순서대로 인쇄되는 것은 아니지만 질문에 따라 순서를 정할 필요는 없습니다.


1
라이브러리의 암시 적 루프? 그러나 새로운 접근 방식은 어쨌든 +1입니다.
Chris Lutz

11
@Chris 대부분의 솔루션에 어딘가에 숨겨진 루프가 있습니까?
moinudin

"컴파일러의 루프"접근 방식을 사용한다고 가정합니다. (의 인수에 대한 가능한 루프 이외의 MPI::Init()) 1000.cpp 프로그램의 실제 이진에서 루프를 상상할 수 없으므로 실행할 때 루프가 실행되고 있지만 +1을주었습니다.
Chris Lutz

40

평범한 C로 :

#include<stdio.h>

/* prints number  i */ 
void print1(int i) {
    printf("%d\n",i);
}

/* prints 10 numbers starting from i */ 
void print10(int i) {
    print1(i);
    print1(i+1);
    print1(i+2);
    print1(i+3);
    print1(i+4);
    print1(i+5);
    print1(i+6);
    print1(i+7);
    print1(i+8);
    print1(i+9);
}

/* prints 100 numbers starting from i */ 
void print100(int i) {
    print10(i);
    print10(i+10);
    print10(i+20);
    print10(i+30);
    print10(i+40);
    print10(i+50);
    print10(i+60);
    print10(i+70);
    print10(i+80);
    print10(i+90);
}

/* prints 1000 numbers starting from i */ 
void print1000(int i) {
    print100(i);
    print100(i+100);
    print100(i+200);
    print100(i+300);
    print100(i+400);
    print100(i+500);
    print100(i+600);
    print100(i+700);
    print100(i+800);
    print100(i+900);
}


int main() {
        print1000(1);
        return 0;
}

물론 다른베이스 (2 : print2 print4 print8 ...)에 대해 동일한 아이디어를 구현할 수 있지만 여기서 1000은 숫자 10을 제안합니다. 중간 기능을 추가하는 줄 수를 줄이십시오 print2() print10() print20() print100() print200() print1000().


1000이라는 숫자가 10을 나타내는 이유는 무엇입니까? 밑이있는 위치 표기법 B에서 1000은 완벽하게 유효한 숫자이며 항상 같습니다 B^3.
Philip

숫자 10이 10으로 표현되는 방식을 고려할 때 인수 분해 "10x10x10"자체가 제안되었지만 다른 대안도 가능하다는 것을 의미했습니다. "base"대신 "factorization"이라고 말해야했던 것 같습니다
leonbloy

34

특수 반복자와 함께 std :: copy ()를 사용하십시오.

#include <algorithm>
#include <iostream>
#include <iterator>

struct number_iterator
{
    typedef std::input_iterator_tag iterator_category;
    typedef int                     value_type;
    typedef std::size_t             difference_type;
    typedef int*                    pointer;
    typedef int&                    reference;

    number_iterator(int v): value(v)                {}
    bool operator != (number_iterator const& rhs)   { return value != rhs.value;}
    number_iterator operator++()                    { ++value; return *this;}
    int operator*()                                 { return value; }
    int value;
};



int main()
{
    std::copy(number_iterator(1), 
              number_iterator(1001), 
              std::ostream_iterator<int>(std::cout, " "));
}

코드가 0에서 시작한다고 생각합니다. Chris와 동의합니다. 몇 년 전에 보았던 질문은 "IO를 제외한 모든 라이브러리없이"라고 언급되었습니다. yet +1 :)
Yakov Galka

3
@Chris Lutz : 복사 구현은 정의되어 있지 않습니다. 위와 같이 템플릿 코드를 사용할 수도 있습니다 (모름입니다). 우리가 모르기 때문에 루프를 사용한다고 말할 수는 없습니다.
Martin York

7
실제로, 내 nit pick은의 std::copy암시 적 조건만큼 암시적인 루프가 아닙니다 operator !=(). 어쨌든, 그것은 범위를 처리하는 데 영리한 일이며, 영리한 접근 방식은 이와 같은 질문에 대한 응답으로 찾고 있습니다.
Michael Burr

구현 고유은 정의되지 않습니다
selvaiyyamperumal

@selvaiyyamperumal : 정확히 무슨 말을하는지 모르겠습니다. 그러나 행동에 대해 이야기한다면 표준은 당신과 동의하지 않습니다. "구현 정의 동작"은 잘 정의되어 있지만 구현에서 명시 적으로 문서화해야 함을 의미합니다. "정의되지 않은 동작"은 모든 일이 발생할 수 있음을 의미합니다.
Martin York

33

함수 포인터 (ab) 사용. 출력을 증가시키는 전 처리기 마법이 없습니다. ANSI C.

#include <stdio.h>

int i=1;

void x10( void (*f)() ){
    f(); f(); f(); f(); f();
    f(); f(); f(); f(); f();
}

void I(){printf("%i ", i++);}
void D(){ x10( I ); }
void C(){ x10( D ); }
void M(){ x10( C ); }

int main(){
    M();
}

3
이것이 내가 생각한 것입니다. 이전 사람은 5 * 5 * 5 * 8 = 1000이라고 말했습니다. 나는 그가 명백한 10 ^ 3을 놓치고있는 것이 재미 있다고 생각했다. 좋은 해결책!
Evan Moran

32
#include <iostream>
#include <iterator>
using namespace std;

int num() { static int i = 1; return i++; }
int main() { generate_n(ostream_iterator<int>(cout, "\n"), 1000, num); }

30

미운 C 답변 (10의 거듭 제곱 당 하나의 스택 프레임에 대해서만 풀림) :

#define f5(i) f(i);f(i+j);f(i+j*2);f(i+j*3);f(i+j*4)
void f10(void(*f)(int), int i, int j){f5(i);f5(i+j*5);}
void p1(int i){printf("%d,",i);}
#define px(x) void p##x##0(int i){f10(p##x, i, x);}
px(1); px(10); px(100);

void main()
{
  p1000(1);
}

3
괜찮아, 왜 "void main ()"? 나쁜 습관은 거의 가지 않습니까? : P
Nawaz

30
@Nawaz : 이것은 비밀리에 Windows GUI 앱이므로 중요하지 않습니다. 나는 가재에 대해 생각하고 끔찍한 철자가 있기 때문에 나는 단지 "메인"이라고 불렀습니다.
Martin

29

스택 오버플로:

#include <stdio.h>

static void print_line(int i)
{   
 printf("%d\n", i); 
 print_line(i+1);
}   

int main(int argc, char* argv[])
{   
 //get up near the stack limit
 char tmp[ 8388608 - 32 * 1000 - 196 * 32 ];
 print_line(1);
} 

이것은 8MB 스택입니다. 각 함수 호출은 약 32 바이트 (따라서 32 * 1000)를 차지합니다. 그러나 내가 그것을 실행할 때 나는 단지 804에 도달했다. (따라서 196 * 32; 아마도 C 런타임에는 스택에 다른 부분이있어 공제해야한다).


25

함수 포인터로 재미있게 즐기십시오 (새로운 기능을 갖춘 TMP는 필요하지 않습니다).

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


#define MSB(typ) ((sizeof(typ) * CHAR_BIT) - 1)

void done(int x, int y);
void display(int x, int y);

void (*funcs[])(int,int)  = {
    done,
    display
};

void done(int x, int y)
{
    exit(0);
}

void display(int x, int limit)
{
    printf( "%d\n", x);
    funcs[(((unsigned int)(x-limit)) >> MSB(int)) & 1](x+1, limit);
}


int main()
{
    display(1, 1000);
    return 0;
}

부수적으로 나는 조건부에 대한 금지를 논리 및 관계 연산자로 확장했습니다. 논리적 부정을 허용하면 순환 호출을 다음과 같이 단순화 할 수 있습니다.

funcs[!!(limit-1)](x+1, limit-1);

나는 당신이 비트 시프트로 그것을 얻는 방식을 좋아합니다. 그러나 당신의 단순화와 함께 더블 뱅은 무엇을합니까? 비트 또는 논리? 메신저 잃어버린 구글 서클에서 주위를 돌아 다니는funcs[!!(limit-1)](x+1, limit-1);
jon_darkstar

차라리 싱글을 가지고 !함수 포인터 배열 요소를 전환 하고 싶지만 , 그것이 다른 미친 사람들과 잘 어울릴 지 모르겠습니다.
Chris Lutz

@Chris : 완전히 동의하지만 게시 후까지 논리 / 관계 연산자 사용을 고려하지 않았으며 한 줄 패치가 더 적합 할 것이라고 생각했습니다. 게다가, 그것은 문제의 전체 혼란스러운 느낌과 조금 더 잘 맞습니다.
Michael Burr

24

이 답변이 매우 간단하고 이해하기 쉽다고 생각합니다.

int print1000(int num=1)
{
    printf("%d\n", num);

    // it will check first the num is less than 1000. 
    // If yes then call recursive function to print
    return num<1000 && print1000(++num); 
}

int main()
{
    print1000();
    return 0;        
}

3
귀하의 답변은 질문에 따라 금지 된 조건문을 사용합니다.
stevelove

4
조건문은 다른 경우입니다. 방금 논리 연산을 사용했습니다 !! 분명하다!
Pappu

2
귀하의 의견에도 "그렇다면 재귀 함수를 호출하여 인쇄하십시오"라고 썼습니다. 명백한 방식으로 작성된 조건문은 여전히 ​​조건부입니다. num 기본값은 조건부입니다.
Gerry

23

나는 모든 재미를 놓 쳤고, 모든 좋은 C ++ 답변은 이미 게시되었습니다!

이것은 내가 생각해 낼 수있는 가장 이상한 일이지만, 합법적 인 C99 인 것은 내기하지 않을 것입니다 : p

#include <stdio.h>

int i = 1;
int main(int argc, char *argv[printf("%d\n", i++)])
{
  return (i <= 1000) && main(argc, argv);
}

약간의 부정 행위 와 함께 또 하나 :

#include <stdio.h>
#include <boost/preprocessor.hpp>

#define ECHO_COUNT(z, n, unused) n+1
#define FORMAT_STRING(z, n, unused) "%d\n"

int main()
{
    printf(BOOST_PP_REPEAT(1000, FORMAT_STRING, ~), BOOST_PP_ENUM(LOOP_CNT, ECHO_COUNT, ~));
}

마지막 아이디어, 같은 속임수 :

#include <boost/preprocessor.hpp>
#include <iostream>

int main()
{
#define ECHO_COUNT(z, n, unused) BOOST_PP_STRINGIZE(BOOST_PP_INC(n))"\n"
    std::cout << BOOST_PP_REPEAT(1000, ECHO_COUNT, ~) << std::endl;
}

main내가 기억하는 것처럼 호출 하면 정의되지 않은 동작이 발생합니다.
Yakov Galka

4
완전 합법적 C입니다. @ybungalobill : main () 호출이 구체적으로 허용되지 않는 C ++에 대해 생각해야합니다.
Michael Foukarakis

@Michael : 아마도 C에 익숙하지 않을 것입니다.
Yakov Galka

Boost를 사용하면 C ++을 의미한다고 생각합니다. 그럼에도 불구하고 Boost.PP 솔루션에 대한 조언.
me22

6
논리 연산자 &&||(마찬가지로 가능성이 그들이 단락부터 "조건문"에 속하는 것입니다 ?:).
munificent

22

파이처럼 쉬운 :

int main(int argc, char* argv[])
{
    printf(argv[0]);
}

실행 방법 :

printer.exe "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94;95;96;97;98;99;100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115;116;117;118;119;120;121;122;123;124;125;126;127;128;129;130;131;132;133;134;135;136;137;138;139;140;141;142;143;144;145;146;147;148;149;150;151;152;153;154;155;156;157;158;159;160;161;162;163;164;165;166;167;168;169;170;171;172;173;174;175;176;177;178;179;180;181;182;183;184;185;186;187;188;189;190;191;192;193;194;195;196;197;198;199;200;201;202;203;204;205;206;207;208;209;210;211;212;213;214;215;216;217;218;219;220;221;222;223;224;225;226;227;228;229;230;231;232;233;234;235;236;237;238;239;240;241;242;243;244;245;246;247;248;249;250;251;252;253;254;255;256;257;258;259;260;261;262;263;264;265;266;267;268;269;270;271;272;273;274;275;276;277;278;279;280;281;282;283;284;285;286;287;288;289;290;291;292;293;294;295;296;297;298;299;300;301;302;303;304;305;306;307;308;309;310;311;312;313;314;315;316;317;318;319;320;321;322;323;324;325;326;327;328;329;330;331;332;333;334;335;336;337;338;339;340;341;342;343;344;345;346;347;348;349;350;351;352;353;354;355;356;357;358;359;360;361;362;363;364;365;366;367;368;369;370;371;372;373;374;375;376;377;378;379;380;381;382;383;384;385;386;387;388;389;390;391;392;393;394;395;396;397;398;399;400;401;402;403;404;405;406;407;408;409;410;411;412;413;414;415;416;417;418;419;420;421;422;423;424;425;426;427;428;429;430;431;432;433;434;435;436;437;438;439;440;441;442;443;444;445;446;447;448;449;450;451;452;453;454;455;456;457;458;459;460;461;462;463;464;465;466;467;468;469;470;471;472;473;474;475;476;477;478;479;480;481;482;483;484;485;486;487;488;489;490;491;492;493;494;495;496;497;498;499;500;501;502;503;504;505;506;507;508;509;510;511;512;513;514;515;516;517;518;519;520;521;522;523;524;525;526;527;528;529;530;531;532;533;534;535;536;537;538;539;540;541;542;543;544;545;546;547;548;549;550;551;552;553;554;555;556;557;558;559;560;561;562;563;564;565;566;567;568;569;570;571;572;573;574;575;576;577;578;579;580;581;582;583;584;585;586;587;588;589;590;591;592;593;594;595;596;597;598;599;600;601;602;603;604;605;606;607;608;609;610;611;612;613;614;615;616;617;618;619;620;621;622;623;624;625;626;627;628;629;630;631;632;633;634;635;636;637;638;639;640;641;642;643;644;645;646;647;648;649;650;651;652;653;654;655;656;657;658;659;660;661;662;663;664;665;666;667;668;669;670;671;672;673;674;675;676;677;678;679;680;681;682;683;684;685;686;687;688;689;690;691;692;693;694;695;696;697;698;699;700;701;702;703;704;705;706;707;708;709;710;711;712;713;714;715;716;717;718;719;720;721;722;723;724;725;726;727;728;729;730;731;732;733;734;735;736;737;738;739;740;741;742;743;744;745;746;747;748;749;750;751;752;753;754;755;756;757;758;759;760;761;762;763;764;765;766;767;768;769;770;771;772;773;774;775;776;777;778;779;780;781;782;783;784;785;786;787;788;789;790;791;792;793;794;795;796;797;798;799;800;801;802;803;804;805;806;807;808;809;810;811;812;813;814;815;816;817;818;819;820;821;822;823;824;825;826;827;828;829;830;831;832;833;834;835;836;837;838;839;840;841;842;843;844;845;846;847;848;849;850;851;852;853;854;855;856;857;858;859;860;861;862;863;864;865;866;867;868;869;870;871;872;873;874;875;876;877;878;879;880;881;882;883;884;885;886;887;888;889;890;891;892;893;894;895;896;897;898;899;900;901;902;903;904;905;906;907;908;909;910;911;912;913;914;915;916;917;918;919;920;921;922;923;924;925;926;927;928;929;930;931;932;933;934;935;936;937;938;939;940;941;942;943;944;945;946;947;948;949;950;951;952;953;954;955;956;957;958;959;960;961;962;963;964;965;966;967;968;969;970;971;972;973;974;975;976;977;978;979;980;981;982;983;984;985;986;987;988;989;990;991;992;993;994;995;996;997;998;999;1000"

사양은 시퀀스가 코드 에서 생성되어야한다고 말하지 않습니다 :)


18
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class Printer
{
public:
 Printer() { cout << ++i_ << "\n"; }
private:
 static unsigned i_;
};

unsigned Printer::i_ = 0;

int main()
{
 Printer p[1000];
}

15
#include <stdio.h>

void nothing(int);
void next(int);
void (*dispatch[2])(int) = {next, nothing};

void nothing(int x) { }
void next(int x)
{
    printf("%i\n", x);
    dispatch[x/1000](x+1);
}

int main()
{
    next(1);
    return 0;
}

15

더 많은 전 처리기 남용 :

#include <stdio.h>

#define A1(x,y) #x #y "0\n" #x #y "1\n" #x #y "2\n" #x #y "3\n" #x #y "4\n" #x #y "5\n" #x #y "6\n" #x #y "7\n" #x #y "8\n" #x #y "9\n"
#define A2(x) A1(x,1) A1(x,2) A1(x,3) A1(x,4) A1(x,5) A1(x,6) A1(x,7) A1(x,8) A1(x,9)
#define A3(x) A1(x,0) A2(x)
#define A4 A3(1) A3(2) A3(3) A3(4) A3(5) A3(6) A3(7) A3(8) A3(9)
#define A5 "1\n2\n3\n4\n5\n6\n7\n8\n9\n" A2() A4 "1000\n"

int main(int argc, char *argv[]) {
    printf(A5);
    return 0;
}

너무 더럽습니다. 샤워하러 가야겠다


2
A2()그런 주장없이 부를 수 있습니까 ?
Chris Lutz

나는 그것에 대해 궁금했다. GCC와 제대로 작동하지만 제대로 정의되어 있는지 모르겠습니다.
keithmo

C99에 잘 정의되어 있으며 C89가 말한 것을 기억하지 마십시오. 메모리가 제공되는 경우 적어도 일부 버전의 MSVC에서 문제가 발생합니다.
zwol

15

POSIX 솔루션이 승인 된 경우 :

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>

static void die(int sig) {
    exit(0);
}

static void wakeup(int sig) {
    static int counter = 1;
    struct itimerval timer;
    float i = 1000 / (1000 - counter);

    printf("%d\n", counter++);

    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 0;
    timer.it_value.tv_sec = 0;
    timer.it_value.tv_usec = i; /* Avoid code elimination */
    setitimer(ITIMER_REAL, &timer, 0);
}

int main() {
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    signal(SIGFPE, die);
    signal(SIGALRM, wakeup);
    wakeup(0);
    pthread_mutex_lock(&mutex);
    pthread_mutex_lock(&mutex); /* Deadlock, YAY! */
    return 0;
}

13

버그에 대한 제한이 없기 때문에 ..

int i=1; int main() { int j=i/(i-1001); printf("%d\n", i++); main(); }

아니면 더 나은 (?)

#include <stdlib.h>
#include <signal.h>

int i=1;
int foo() { int j=i/(i-1001); printf("%d\n", i++); foo(); }

int main()
{
        signal(SIGFPE, exit);
        foo();
}

2
그렇지 않으면 사용하지 않는 j를 유지하기 위해 컴파일러 최적화를 피해야합니다.
반디

2
그는 다음 volatile과 같이 선언에 추가하면 됩니다.j
Patrick Schlüter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.