루프 또는 조건부없이 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 명령어입니다 : cmpwi와 crnot.
— 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.