Mencetak 1 hingga 1000 tanpa loop atau kondisional
323
Tugas : Mencetak angka dari 1 hingga 1000 tanpa menggunakan perulangan atau pernyataan kondisional. Jangan hanya menulis printf()atau coutpernyataan 1000 kali.
Bagaimana Anda melakukannya dengan menggunakan C atau C ++?
Jawaban yang jelas adalah menggunakan 500 panggilan ke printfdan mencetak dua nomor setiap kali, bukan?
James McNellis
433
printf ("angka dari 1 hingga 1000");
jondavidjohn
7
:?bukan pernyataan kondisional (ini ungkapan) ...
Chris Lutz
127
Wawancarai kesempatan Anda untuk bersinar. Beri tahu mereka "Tanpa loop atau kondisional? Permainan anak-anak. Saya bisa melakukannya tanpa komputer!" Lalu tarik keluar pulpen dan notepad. Mereka mungkin memberi Anda pandangan bingung, tetapi cukup jelaskan bahwa jika Anda tidak dapat mengandalkan konstruksi bahasa yang dibangun, Anda benar-benar tidak dapat mengasumsikan apa pun.
JohnFx
8
Secara pribadi, saya pikir ada beberapa jawaban yang memiliki solusi cerdas dan menarik. Saya juga berpikir bahwa sementara ini bisa dengan mudah menjadi pertanyaan wawancara yang mengerikan, mungkin ada nilai yang baik di dalamnya, selama pewawancara benar-benar tidak mencari solusi yang benar-benar baik seperti mencari apakah orang yang diwawancarai mempertimbangkan pendekatan yang mengindikasikan pengetahuan tentang TMP atau menggunakan konstruksi dengan cara yang tidak biasa. Saya pikir akan buruk jika ini digunakan sebagai pertanyaan murni 'benar-benar / salah', tetapi jika digunakan sebagai titik awal diskusi, saya bisa melihat banyak nilai.
Michael Burr
Jawaban:
785
Kompilasi rekursi waktu! : P
#include<iostream>template<int N>structNumberGeneration{staticvoidout(std::ostream& os){NumberGeneration<N-1>::out(os);
os << N << std::endl;}};template<>structNumberGeneration<1>{staticvoidout(std::ostream& os){
os <<1<< std::endl;}};int main(){NumberGeneration<1000>::out(std::cout);}
Adakah yang bisa menjelaskan kepada saya bagaimana cara kerjanya? cukup mengesankan.
Gat
28
@Zack: Ayo menjadi nyata, kami mencetak 1.000 baris dari program yang ditulis untuk menghindari loop. Performa bukan masalah.
dreamlax
42
Bagi mereka yang cukup penasaran untuk mengkompilasi ini: di g ++, set -ftemplate-depth-1000. Maksimum rekursi templat default adalah 500.
Tom
6
Ini masih menggunakan kondisi: pencocokan pola dimuliakan jika.
David K.
10
@dreamlax: Ini hanya salah satu dari hal-hal yang telah saya pelajari dari pengalaman selama bertahun-tahun: gunakan '\n'kecuali jika Anda benar-benar ingin memerah, gunakan ++ikecuali Anda benar-benar membutuhkan nilai sebelumnya i, lewati constreferensi kecuali Anda memiliki alasan kuat untuk tidak ... Ketika pengembang berhenti memikirkan hal ini (atau bahkan tidak pernah memulai), mereka akan, cepat atau lambat, mengalami masalah di mana ini penting, hanya saja mereka bahkan tidak tahu ada titik di mana itu mungkin penting.
sbi
1195
Yang ini sebenarnya mengkompilasi ke perakitan yang tidak memiliki persyaratan:
Nah, kode dalam jawaban ini jelas bukan C atau C ++, jadi ini tidak masalah hanya jika kita membatalkan persyaratan. Maka jawaban apa pun mungkin memenuhi syarat karena penyusun hipotesis mungkin hanya menghasilkan program yang diperlukan dari input apa pun.
Persamaan
321
@PP, itu cukup panjang untuk dijelaskan, tetapi pada dasarnya, pada jawalnya 1karena sebenarnya argc, yaitu 1jika program dipanggil tanpa argumen. Kemudian, j/1000adalah 0sampai jmenjadi 1000, setelah itu 1. (exit - main)tentu saja adalah perbedaan antara alamat exit()dan main(). Itu berarti (main + (exit - main)*(j/1000))adalah main()sampai jmenjadi 1000, setelah itu menjadi exit(). Hasil akhirnya adalah yang main()dipanggil saat program dijalankan, kemudian memanggil dirinya secara rekursif 999 kali sambil menambah j, kemudian memanggil exit(). Wah :)
Frédéric Hamidi
7
Ini adalah salah satu penyalahgunaan CI yang paling menakjubkan yang pernah ada. Tetapi apakah ini akan bekerja pada semua platform?
Qwertie
13
@ Mark: ini adalah tanda tangan non-standar utama, Anda dilarang memanggil utama secara rekursif, dan hasil pengurangan pointer fungsi tidak ditentukan.
Yakov Galka
9
Ya, ya, ini bukan kode C ++ legal untuk alasan yang diberikan @ybungalobill, tapi saya harus memberi +1 untuk kegilaan belaka dan fakta bahwa ia mengkompilasi dan bekerja pada beberapa platform. Ada kalanya respon yang benar untuk "Tapi itu bukan standar!" adalah "Siapa yang peduli!" :)
Orang telah memposting ini. Versi lain meneruskan nomor untuk dicetak daripada menggunakan global, tetapi pada dasarnya solusi yang sama.
Chris Lutz
1
@ Chris, mereka menggunakan logika yang sama diekspresikan dalam makro atau templat, meledakkan ukuran kode, kan? Anda mungkin juga menghasilkan string output itu sendiri daripada seribu printfs.
Darius Bacon
Oh ya, saya melihat jawaban Keith menghasilkan seluruh string, keren. :) Saya melewatkan itu.
Darius Bacon
43
Yah, usaha yang bagus, tetapi agak aneh bahwa Anda tidak menguraikan 8 menjadi 2 * 2 * 2 dan dengan demikian menggunakan factorisation prima yang unik
orang mungkin berpendapat bahwa menggunakan copyitu curang
John Dibling
13
@ Johnannes sebenarnya saya cukup yakin printfmemiliki loop: p
icecrime
1
@ litb: Catatan Saya tidak mengatakan bahwa "menggunakan copyadalah kecurangan"
John Dibling
2
@ John: menyalin itu curang. apakah anda meragukannya? : P
Nawaz
1
pada skala dari 1 hingga 10, bagaimana saya menggunakan biner?
Jordan
270
Inilah tiga solusi yang saya tahu. Yang kedua mungkin diperdebatkan.
// compile time recursiontemplate<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(){staticint N =1;
cout << N++<<'\n';}};int main(){
f1<1000>();
f2(1000);delete[]new A[1000];// (3)
A data[1000];// (4) added by Martin York}
[ Sunting: (1) dan (4) dapat digunakan hanya untuk konstanta waktu kompilasi, (2) dan (3) dapat digunakan untuk ekspresi runtime juga - sunting akhir. ]
Juga, saya akan berdebat tentang hubungan arus pendek yang tidak menjadi persyaratan ... Bukan pernyataan, benar, tetapi ekspresi kondisi, saya katakan. Asalkan kita mendefinisikan ekspresi kondisional sebagai "sesuatu yang menghasilkan lompatan kondisional dalam assembler".
Kos
5
Pertanyaan yang menghantam saya ketika membaca konstruktor satu: Apakah mandat standar bahwa setiap item dalam array dibangun secara berurutan? Akan menjadi masalah jika konstruktor memiliki efek samping. Saya yakin setiap kompiler waras mengimplementasikannya sebagai 0 -> 1000 loop tapi saya ingin tahu apakah Anda masih bisa compliant dan loop mundur ...
Joseph Garvin
6
@ Joseph - Konstruksi satu tidak boleh terpengaruh oleh apa urutan objek individu dimulai, tetapi itu adalah pertanyaan yang bagus.
Chris Lutz
12
@ Joseph ini didefinisikan oleh 12.6 / 3 (C ++ 03). Inisialisasi dilakukan dalam urutan berlangganan.
Johannes Schaub - litb
2
@ Joseph: Dan mereka hancur dalam urutan terbalik juga, sehingga Anda dapat menggunakan destruktor dengan mudah :)
favorit saya setelah 'printf ("angka 1 hingga 1000")' - pertanyaan konyol memerlukan jawaban konyol.
SEngstrom
ini luar biasa. +1 untuk memanfaatkan ambiguitas dalam pertanyaan. haha
Nawaz
2
Diedit; tidak dalam cara, bentuk, atau bentuk melakukan kode ini print "Print numbers from 1 to 1000."- pertanyaan ambigu untuk menang, deskripsi akurat mengisap :)
sehe
Wow, sudah ada sedikit vandalisme pada jawaban pertanyaan ini akhir-akhir ini. Sesuatu memberitahu saya bahwa kita harus memutakhirkan kunci itu menjadi kunci historis.
BoltClock
172
Trigger kesalahan fatal! Inilah file itu, countup.c:
Anda harus memanggil fflush (stdout); setelah setiap printf () ... Ketika sebuah program crash, itu tidak dijamin bahwa buffer output akan dicetak di layar.
zakk
10
@ zakk: Itu tidak sepenuhnya diperlukan - secara default stdout adalah buffered baris, sehingga \nakan cukup untuk menyiram output.
psmears
24
stdout adalah buffer line jika dapat ditentukan sebagai perangkat interaktif , jika tidak buffered sepenuhnya. Jika profesor mengalihkan stdout ke file untuk pemeriksaan otomatis, Anda akan gagal :-)
paxdiablo
bahaya stackoverflow (misalnya dalam lingkungan tertanam)
Peluang tinggi /usr/bin/seqmenggunakan loop secara internal. :)
@jokester: maksud Anda, karena Solaris / BSD tidak memiliki sequtilitas (dalam pengaturan default)? <nyengir />
sehe
Saya benci mengatakan ini (well, tidak, saya tidak), tetapi ada bug dalam solusi Anda. Itu tidak mencetak set angka yang tepat. :) Inilah solusinya: system("/bin/echo {1..1000}"); Andai saja Anda telah menulis unit test terlebih dahulu ...
Don Branson
1
Beberapa pria cerdas memutuskan untuk mengubah jawaban saya, jadi itu bukan kesalahan saya.
persyaratan adalah "tanpa syarat" (jika, aktifkan, dll). bukan "tanpa syarat"
jon_darkstar
32
<bukan suatu kondisi. Ini operator relasional. ifSaya elseadalah pernyataan kondisional. ?:adalah operator bersyarat. <hanyalah operator yang mengembalikan nilai boolean. Ini mungkin instruksi mesin tunggal tanpa lompatan atau apa pun.
Chris Lutz
12
@ Chris Lutz: Pada x86, itu 3 instruksi: cmpl, setle, dan movzbl. x86-64 adalah bahwa plus a cltq. PowerPC adalah 2 instruksi: cmpwidan crnot.
Adam Rosenfield
4
1 - i / 1000. Tidak ada perbandingan!
Thai
96
Agak membosankan dibandingkan dengan yang lain di sini, tapi mungkin yang mereka cari.
Buat lebih pendek. set i = 1 di luar main dan kemudian di dalam main: printf ("% d \ n", 11 - i) && --i && main (i);
jftuga
3
@Jens Schauder: Dengan memanfaatkan &&evaluasi malas di baris pertama f().
Rafał Dowgird
10
Ini tidak membosankan, itu sederhana. Jika Anda dapat melakukan hal yang sama dengan fungsi pendek seperti yang Anda dapat dengan kekacauan besar template templat, maka Anda harus melakukannya dengan fungsi :)
amertune
21
&& adalah persyaratan. AND matematika akan mengevaluasi kedua belah pihak (seperti Java & dan Ada "DAN" tidak). && akan mengevaluasi operator ke-2 hanya jika (ini dia) yang pertama adalah benar. Atau contoh lain: Di Ada itu operator hubung singkat disebut "ATAU KEMUDIAN" - menggunakan KEMUDIAN untuk menunjukkan aspek bersyarat. Maaf, Anda bisa menggunakan saja? : operator.
Martin
Tidak perlu meminta maaf. && adalah operator pembanding. Operator ternary adalah suatu kondisi.
Aaron
71
Tugas tidak pernah menentukan bahwa program harus dihentikan setelah 1000.
Itu tidak berhenti pada 1000, meskipun. Itu terus berjalan.
Remy Lebeau
Dapat dipersingkat hanya jika Anda membatalkan persyaratan C atau C ++. Maka "program" apa pun akan dilakukan, karena kompilator teoretis dapat menghasilkan program yang Anda inginkan (dari input apa pun).
Persamaan
@ eq Sekali lagi, ini mengkompilasi dan berjalan dengan baik ...
Mark McDonald
72
Sebagai renungan: kita bahkan dapat menghindari matematika yang tampak jelas . Jika kami mempekerjakan rand(), kami akan mencetak semua angka dari 1 hingga 1000. Akhirnya =: P
5
@pooh: Tidak harus, karena rand () memiliki kesempatan untuk mengulangi setelah urutan tertentu, dan urutan yang mungkin tidak jatuh dalam solusi yang ditetapkan untuk masalah ini
dchhetri
71
Mudah seperti pai! : P
#include<iostream>staticint current =1;structprint{print(){ std::cout << current++<< std::endl;}};int main(){print numbers [1000];}
Anda mungkin ingin melakukan "static int current = 0" jika tidak akan mencetak dari 2 hingga 1001.
Shinnok
saya mengubah ++ saat ini menjadi ++ saat ini
Zelix
65
#include<stdio.h>#defineOut(i) printf("%d\n", i++);#define REP(N) N N N N N N N N N N
#defineOut1000(i) REP(REP(REP(Out(i))));void main(){int i =1;Out1000(i);}
Kami dapat meluncurkan 1000 utas, masing-masing mencetak salah satu nomor. Instal OpenMPI , kompilasi menggunakan mpicxx -o 1000 1000.cppdan jalankan menggunakan mpirun -np 1000 ./1000. Anda mungkin perlu menambah batas deskriptor menggunakan limitatau ulimit. Perhatikan bahwa ini akan agak lambat, kecuali jika Anda memiliki banyak core!
Loop implisit di perpustakaan? Tapi +1 tetap untuk pendekatan baru.
Chris Lutz
11
@ Chris Tidak sebagian besar solusi memiliki loop tersembunyi di suatu tempat?
moinudin
Saya kira, jika Anda mengambil pendekatan "loop in the compiler". Karena (di luar kemungkinan loop atas argumen di MPI::Init()) Saya tidak bisa membayangkan loop dalam biner sebenarnya dari program 1000.cpp Anda, saya memberi Anda +1, meskipun pasti ada loop berjalan ketika Anda menjalankannya.
Chris Lutz
40
Dengan C polos:
#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);return0;}
Tentu saja, Anda dapat menerapkan ide yang sama untuk pangkalan lain (2: print2 print4 print8 ...) tetapi angka 1000 di sini menyarankan pangkalan 10. Anda juga dapat mengurangi sedikit garis yang menambahkan fungsi perantara: print2() print10() print20() print100() print200() print1000()dan alternatif lain yang setara.
Mengapa angka 1000 menyarankan basis 10? Dalam setiap notasi posisi dengan basis B, 1000 adalah angka yang benar-benar valid dan selalu sama B^3.
Philip
Saya hanya bermaksud bahwa, mengingat bagaimana angka tersebut diwakili dalam basis 10, faktorisasi "10x10x10" menyarankan dirinya sendiri, tetapi alternatif lain dimungkinkan. Saya kira saya seharusnya mengatakan "faktorisasi" bukannya "basis"
leonbloy
34
Cukup gunakan std :: copy () dengan iterator khusus.
Saya pikir kode Anda mulai dari 0. Juga setuju dengan Chris, pertanyaan seperti yang saya lihat tahun lalu dinyatakan sebagai "tanpa perpustakaan kecuali untuk IO". Belum +1 :)
Yakov Galka
3
@ Chris Lutz: Implementasi salinan tidak ditentukan. Saya bahkan dapat menggunakan kode templat seperti di atas (Anda tidak tahu;) Jadi Anda tidak bisa mengatakan itu menggunakan loop karena kami tidak tahu.
Martin York
7
Sebenarnya, nit pick saya tidak akan menjadi loop implisit dalam std::copysebanyak kondisi implisit dalam operator !=(). Bagaimanapun juga, ini adalah cara yang cerdas dalam memproses suatu rentang, dan pendekatan cerdas adalah apa yang saya cari dalam menanggapi pertanyaan-pertanyaan seperti ini.
Michael Burr
implementasi spesifik tidak ditentukan
selvaiyyamperumal
@selvaiyyamperumal: Tidak yakin persis apa yang Anda bicarakan. Tetapi jika Anda berbicara tentang perilaku maka standar tidak setuju dengan Anda. "Perilaku yang Didefinisikan Implementasi" berarti didefinisikan dengan baik tetapi harus didokumentasikan secara eksplisit oleh implementasi. "Perilaku Tidak Terdefinisi" berarti segala sesuatu dapat terjadi.
Martin York
33
Pointer fungsi (ab) gunakan. Tidak ada keajaiban preprosesor untuk meningkatkan output. 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();}
semua hal baik-baik saja, tetapi mengapa "void main ()"? kebiasaan buruk jarang pergi? : P
Nawaz
30
@Nawaz: Karena ini diam-diam adalah aplikasi Windows GUI, jadi tidak masalah. Saya hanya menyebutnya "utama" karena saya berpikir tentang lobster dan memiliki ejaan yang mengerikan.
Martin
29
Stack overflow:
#include<stdio.h>staticvoid print_line(int i){
printf("%d\n", i);
print_line(i+1);}int main(int argc,char* argv[]){//get up near the stack limitchar tmp[8388608-32*1000-196*32];
print_line(1);}
Ini untuk tumpukan 8MB. Setiap pemanggilan fungsi tampaknya memakan waktu sekitar 32 byte (karenanya 32 * 1000). Tapi kemudian ketika saya menjalankannya saya hanya perlu 804 (maka 196 * 32; mungkin runtime C memiliki bagian lain di stack yang harus Anda kurangi juga).
Sebagai catatan tambahan: Saya mengambil larangan terhadap persyaratan untuk memperluas ke operator logis dan relasional juga. Jika Anda mengizinkan negasi logis, panggilan rekursif dapat disederhanakan menjadi:
Saya suka cara Anda mendapatkannya dengan bit shift. tetapi dengan penyederhanaan Anda sesudahnya, apa yang dilakukan double bang? itu bitwise atau logis? Saya tersesat dan google membuat saya berkeliling dalam lingkaranfuncs[!!(limit-1)](x+1, limit-1);
jon_darkstar
Saya lebih suka memiliki satu !dan beralih elemen array fungsi pointer, tapi saya tidak tahu apakah itu akan cocok dengan kegilaan Anda yang lain.
Chris Lutz
@ Chris: Saya setuju sepenuhnya - tapi saya tidak mempertimbangkan untuk menggunakan operator logis / relasi sampai setelah memposting, dan saya pikir tambalan satu baris akan lebih tepat. Selain itu, itu cocok sedikit lebih baik dengan seluruh nuansa masalah yang membingungkan.
Michael Burr
24
Saya merasa jawaban ini akan sangat sederhana dan mudah dimengerti.
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 printreturn num<1000&& print1000(++num);}int main(){
print1000();return0;}
Jawaban Anda menggunakan pernyataan kondisional, yang dilarang sesuai dengan pertanyaan.
stevelove
4
pernyataan kondisional adalah jika lain dll. Saya hanya menggunakan operasi logis !! Hpe sudah jelas!
Pappu
2
Bahkan dalam komentar Anda, Anda menulis "Jika ya maka panggil fungsi rekursif untuk mencetak". Sebuah kondisional yang ditulis dengan cara yang tidak jelas masih merupakan suatu kondisi. Default num juga merupakan persyaratan.
Gerry
23
Saya melewatkan semua kesenangan, semua jawaban C ++ yang bagus telah diposting!
Ini adalah hal yang paling aneh yang bisa saya lakukan, saya tidak akan bertaruh itu legal C99: p
#include<stdio.h>int i =1;int main(int argc,char*argv[printf("%d\n", i++)]){return(i <=1000)&& main(argc, argv);}
Satu lagi, dengan sedikit kecurangan:
#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,~));}
Bisakah Anda menelepon A2()tanpa argumen seperti itu?
Chris Lutz
Saya ingin tahu tentang itu sendiri. Ini berfungsi baik dengan GCC, tapi saya tidak tahu apakah itu perilaku yang didefinisikan dengan baik.
keithmo
Didefinisikan dengan baik di C99, tidak ingat apa yang dikatakan C89, tidak menyebabkan masalah dengan setidaknya beberapa versi MSVC jika memori berfungsi.
printf
dan mencetak dua nomor setiap kali, bukan?:?
bukan pernyataan kondisional (ini ungkapan) ...Jawaban:
Kompilasi rekursi waktu! : P
sumber
'\n'
kecuali jika Anda benar-benar ingin memerah, gunakan++i
kecuali Anda benar-benar membutuhkan nilai sebelumnyai
, lewaticonst
referensi kecuali Anda memiliki alasan kuat untuk tidak ... Ketika pengembang berhenti memikirkan hal ini (atau bahkan tidak pernah memulai), mereka akan, cepat atau lambat, mengalami masalah di mana ini penting, hanya saja mereka bahkan tidak tahu ada titik di mana itu mungkin penting.Yang ini sebenarnya mengkompilasi ke perakitan yang tidak memiliki persyaratan:
Sunting: Ditambahkan '&' sehingga akan mempertimbangkan alamat maka menghindari kesalahan pointer.
Versi di atas dalam standar C, karena tidak bergantung pada aritmatika pada pointer fungsi:
sumber
j
awalnya1
karena sebenarnyaargc
, yaitu1
jika program dipanggil tanpa argumen. Kemudian,j/1000
adalah0
sampaij
menjadi1000
, setelah itu1
.(exit - main)
tentu saja adalah perbedaan antara alamatexit()
danmain()
. Itu berarti(main + (exit - main)*(j/1000))
adalahmain()
sampaij
menjadi1000
, setelah itu menjadiexit()
. Hasil akhirnya adalah yangmain()
dipanggil saat program dijalankan, kemudian memanggil dirinya secara rekursif 999 kali sambil menambahj
, kemudian memanggilexit()
. Wah :)Saya terkejut tidak ada yang tampaknya telah memposting ini - saya pikir itu adalah cara yang paling jelas.
1000 = 5*5*5*8.
sumber
Sepertinya tidak perlu menggunakan loop
sumber
copy
itu curangprintf
memiliki loop: pcopy
adalah kecurangan"Inilah tiga solusi yang saya tahu. Yang kedua mungkin diperdebatkan.
[ Sunting: (1) dan (4) dapat digunakan hanya untuk konstanta waktu kompilasi, (2) dan (3) dapat digunakan untuk ekspresi runtime juga - sunting akhir. ]
sumber
Saya tidak menulis pernyataan printf 1000 kali!
Sama-sama ;)
sumber
$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
Itu tidak mencetak semua angka, tetapi "Cetak angka dari 1 hingga 1000." Pertanyaan mendua untuk menang! :)
sumber
print "Print numbers from 1 to 1000."
- pertanyaan ambigu untuk menang, deskripsi akurat mengisap :)Trigger kesalahan fatal! Inilah file itu, countup.c:
Kompilasi, lalu jalankan pada prompt shell:
Ini memang mencetak angka dari 1 hingga 1000, tanpa loop atau persyaratan!
sumber
\n
akan cukup untuk menyiram output.Menggunakan perintah sistem:
sumber
/usr/bin/seq
menggunakan loop secara internal. :)seq
utilitas (dalam pengaturan default)? <nyengir />system("/bin/echo {1..1000}");
Andai saja Anda telah menulis unit test terlebih dahulu ...Belum diuji, tetapi harus vanilla standar C:
sumber
<
bukan suatu kondisi. Ini operator relasional.if
Sayaelse
adalah pernyataan kondisional.?:
adalah operator bersyarat.<
hanyalah operator yang mengembalikan nilai boolean. Ini mungkin instruksi mesin tunggal tanpa lompatan atau apa pun.cmpl
,setle
, danmovzbl
. x86-64 adalah bahwa plus acltq
. PowerPC adalah 2 instruksi:cmpwi
dancrnot
.1 - i / 1000
. Tidak ada perbandingan!Agak membosankan dibandingkan dengan yang lain di sini, tapi mungkin yang mereka cari.
sumber
&&
evaluasi malas di baris pertamaf()
.Tugas tidak pernah menentukan bahwa program harus dihentikan setelah 1000.
( Dapat disingkat menjadi ini jika Anda menjalankan ./a.out tanpa params tambahan )
sumber
rand()
, kami akan mencetak semua angka dari 1 hingga 1000. Akhirnya =: PMudah seperti pai! : P
sumber
sumber
Kami dapat meluncurkan 1000 utas, masing-masing mencetak salah satu nomor. Instal OpenMPI , kompilasi menggunakan
mpicxx -o 1000 1000.cpp
dan jalankan menggunakanmpirun -np 1000 ./1000
. Anda mungkin perlu menambah batas deskriptor menggunakanlimit
atauulimit
. Perhatikan bahwa ini akan agak lambat, kecuali jika Anda memiliki banyak core!Tentu saja, angkanya tidak harus dicetak secara berurutan, tetapi pertanyaannya tidak mengharuskan mereka dipesan.
sumber
MPI::Init()
) Saya tidak bisa membayangkan loop dalam biner sebenarnya dari program 1000.cpp Anda, saya memberi Anda +1, meskipun pasti ada loop berjalan ketika Anda menjalankannya.Dengan C polos:
Tentu saja, Anda dapat menerapkan ide yang sama untuk pangkalan lain (2: print2 print4 print8 ...) tetapi angka 1000 di sini menyarankan pangkalan 10. Anda juga dapat mengurangi sedikit garis yang menambahkan fungsi perantara:
print2() print10() print20() print100() print200() print1000()
dan alternatif lain yang setara.sumber
B
, 1000 adalah angka yang benar-benar valid dan selalu samaB^3
.Cukup gunakan std :: copy () dengan iterator khusus.
sumber
std::copy
sebanyak kondisi implisit dalamoperator !=()
. Bagaimanapun juga, ini adalah cara yang cerdas dalam memproses suatu rentang, dan pendekatan cerdas adalah apa yang saya cari dalam menanggapi pertanyaan-pertanyaan seperti ini.Pointer fungsi (ab) gunakan. Tidak ada keajaiban preprosesor untuk meningkatkan output. ANSI C.
sumber
sumber
Jawaban jelek Ugly (belum dibuka hanya untuk satu frame stack per daya 10):
sumber
Stack overflow:
Ini untuk tumpukan 8MB. Setiap pemanggilan fungsi tampaknya memakan waktu sekitar 32 byte (karenanya 32 * 1000). Tapi kemudian ketika saya menjalankannya saya hanya perlu 804 (maka 196 * 32; mungkin runtime C memiliki bagian lain di stack yang harus Anda kurangi juga).
sumber
Bersenang-senang dengan pointer fungsi (tidak diperlukan TMP baru):
Sebagai catatan tambahan: Saya mengambil larangan terhadap persyaratan untuk memperluas ke operator logis dan relasional juga. Jika Anda mengizinkan negasi logis, panggilan rekursif dapat disederhanakan menjadi:
sumber
funcs[!!(limit-1)](x+1, limit-1);
!
dan beralih elemen array fungsi pointer, tapi saya tidak tahu apakah itu akan cocok dengan kegilaan Anda yang lain.Saya merasa jawaban ini akan sangat sederhana dan mudah dimengerti.
sumber
Saya melewatkan semua kesenangan, semua jawaban C ++ yang bagus telah diposting!
Ini adalah hal yang paling aneh yang bisa saya lakukan, saya tidak akan bertaruh itu legal C99: p
Satu lagi, dengan sedikit kecurangan:
Ide terakhir, cheat yang sama:
sumber
main
hasil dalam perilaku yang tidak terdefinisi seperti yang saya ingat.&&
dan||
kemungkinan akan jatuh di bawah "kondisi" karena mereka mengalami hubungan pendek (seperti yang akan terjadi?:
).Mudah seperti pie:
metode eksekusi:
Spesifikasi tidak mengatakan bahwa urutan harus dihasilkan di dalam kode :)
sumber
sumber
sumber
Lebih banyak penyalahgunaan preprosesor:
Saya merasa sangat kotor; Saya pikir saya akan mandi sekarang.
sumber
A2()
tanpa argumen seperti itu?Jika solusi POSIX diterima:
sumber
Karena tidak ada batasan pada bug ..
Atau bahkan lebih baik (?),
sumber
volatile
deklarasij