Printing 1 to 1000 without loop or conditionals
Compile time recursion! :P
#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);
}
Printing 1 to 1000 without loop or conditionals
Compile time recursion! :P
#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);
}
Printing 1 to 1000 without loop or conditionals
Compile time recursion! :P
#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);
}
Printing 1 to 1000 without loop or conditionals - in PHP
Here's an interesting oo solution based on PHP's overloading:
class thousand_printer {
public function __construct() {
$this->print1();
}
public function __call($method, $_) {
$count = str_replace('print', '', $method);
echo "$count ";
$this->{"print" . ++$count}();
}
public function print1000() {
echo "1000\n";
}
}
new thousand_printer;
I'm glad my solution is so popular. Here's a slight improvement that offers some modularity:
class printer {
public function __construct() {
$this->print1();
}
public function __call($method, $_) {
$count = str_replace('print', '', $method);
echo "$count ";
$this->{"print" . ++$count}();
}
}
class thousand_printer extends printer {
public function print1001() {}
}
new thousand_printer;
How does the C code that prints from 1 to 1000 without loops or conditional statements work?
Don't ever write code like that.
For j<1000
, j/1000
is zero (integer division). So:
(&main + (&exit - &main)*(j/1000))(j+1);
is equivalent to:
(&main + (&exit - &main)*0)(j+1);
Which is:
(&main)(j+1);
Which calls main
with j+1
.
If j == 1000
, then the same lines comes out as:
(&main + (&exit - &main)*1)(j+1);
Which boils down to
(&exit)(j+1);
Which is exit(j+1)
and leaves the program.
(&exit)(j+1)
and exit(j+1)
are essentially the same thing - quoting C99 §6.3.2.1/4:
A function designator is an expression that has function type. Except when it is the
operand of the sizeof operator or the unary & operator, a function designator with
type "function returning type" is converted to an expression that has type "pointer to
function returning type".
exit
is a function designator. Even without the unary &
address-of operator, it is treated as a pointer to function. (The &
just makes it explicit.)
And function calls are described in §6.5.2.2/1 and following:
The expression that denotes the called function shall have type pointer to function returning void or returning an object type other than an array type.
So exit(j+1)
works because of the automatic conversion of the function type to a pointer-to-function type, and (&exit)(j+1)
works as well with an explicit conversion to a pointer-to-function type.
That being said, the above code is not conforming (main
takes either two arguments or none at all), and &exit - &main
is, I believe, undefined according to §6.5.6/9:
When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; ...
The addition (&main + ...)
would be valid in itself, and could be used, if the quantity added was zero, since §6.5.6/7 says:
For the purposes of these operators, a pointer to an object that is not an element of an
array behaves the same as a pointer to the first element of an array of length one with the
type of the object as its element type.
So adding zero to &main
would be ok (but not much use).
Display numbers from 1 to 100 without loops or conditions
Pseudo code. Uses an array to force an exception after 100 elements which is caught and does nothing.
function r(array a, int index){
a[index] = a[index-1]+1
print a[index]
r(a, index+1)
}
try{
array a;
a.resize(101)
r(a, 1)
}catch(OutOfBoundsException){
}
EDIT
Java code:
public void printTo100(){
int[] array = new int[101];
try{
printToArrayLimit(array, 1);
}catch(ArrayIndexOutOfBoundsException e){
}
}
public void printToArrayLimit(int[] array, int index){
array[index] = array[index-1]+1;
System.out.println(array[index]);
printToArrayLimit(array, index+1);
}
Print 1 to 1000 with out using loop
It works as follows:
Performs the int
division j/1000
, which will return 0
always while j
is smaller than 1000
.
So the pointer operation is as follows:
&main + 0 = &main, for j < 1000.
Then it calls the resulting function pointed by the pointer operations passing as parameter j+1
.
While j
is less than 1000
, it will call main recursively with parameter one more than the step before.
When the value of j
reaches 1000
, then the integer division j/1000
equals to 1
, and the pointer operation results in the following:
&main + &exit - &main = &exit.
It then calls the exit
function, which finishes the program execution.
How to print numbers from 1 to 1000 and then only even numbers within the same loop
You can use unpacking with range like this:
for i in (1,2):
print(*range(i,1001,i))
And if you want to print each number in new line, just change a few things like:
for i in (1,2):
print(*range(i,1001,i), sep='\n')
Related Topics
Catch Exception by Pointer in C++
How to Check Whether Operator== Exists
What Happens in a Double Delete
Is There Any Real Risk to Deriving from the C++ Stl Containers
C++ Code File Extension? Difference Between .Cc and .Cpp
When Vectors Are Allocated, Do They Use Memory on the Heap or the Stack
Tool to Track #Include Dependencies
How to Turn on (Literally) All of Gcc'S Warnings
Is It Safe to Link C++17, C++14, and C++11 Objects
Why Dereferencing a Null Pointer Is Undefined Behaviour
How to Use a C++ String in a Structure When Malloc()-Ing the Same Structure
How to Assert That a Constexpr If Else Clause Never Happen
"Invalid Use of Incomplete Type" Error With Partial Template Specialization