只用一次循环输出如下的内容
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
这算是初级的算法题么 … 很久不写极限简单的代码 … 我试试看好了 …
<?php
/* initialize two variables using for ... */
for ( $x = 1, $y = 1; $y < 10; ++ $x )
/* print the multiplication table ... */
echo "{$x}x{$y}=", $x * $y, ' ',
/* break line then increase y reset x when x equals to y ... */
( $x === $y ) && ( print( PHP_EOL ) ) && ++ $y && $x = 0;
基本原理很简单 …
因为只能使用一次循环 … 所以我们需要在 for 循环内部控制循环的结束 …
虽然代码看起来比两次循环要少 … 但事实上时间复杂度是一样的 …
其实吧 … 生成乘法表的方法有很多种 … 甚至不需要循环都可以解决 …
使用单次循环解决的方法也不仅仅只有我这一种 … 我能想到的至少还有两三种 …
我写这一个版本 … 其他的留给别人好啦 …
没有实现不了 … 关键点就是在创意恩恩 …
C语言
void prt_table()
{
int i, j;
for (i = 1, j = 1; i < 10 && j < 10;) {
printf("%d*%d=%2d ", i, j, i * j);
if (i == j) {
puts();
i = 1;
++j;
}
else if (i < j) {
++i;
}
}
}
puts [*1..9].product([*1..9]).map { |x, y| %Q(#{y} * #{x} = #{x*y}\t#{"\n" if x==y}) if x>=y }.join("")
ruby 1.9.3
站长就不舍得支持下markdown吗
来个clojure的one-liner:
(dorun (for [o (range 1 10) i (range 1 (+ o 1))] (do (print (str o "x" i "=" (* o i) " ")) (when (= i o) (println)))))
在repl中的输出:
user=> (dorun (for [o (range 1 10) i (range 1 (+ o 1))] (do (print (str o "x" i "=" (* o i) " ")) (when (= i o) (println)))))
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
nil
虽然我没看出来在这个很自然的“2层循环”的逻辑中非得用“一次循环”有什么好处(省计算?没有啊?),就当蛋疼吧,来个一次循环的:
(loop [o 1 i 1]
(do
(print (str o "x" i "=" (* o i) " "))
(cond (and (= o i) (= o 9)) nil
(= o i) (do
(println)
(recur (+ 1 o) 1))
true (recur o (+ 1 i)))))
repl中输出:
user=> (loop [o 1 i 1]
#_=> (do
#_=> (print (str o "x" i "=" (* o i) " "))
#_=> (cond (and (= o i) (= o 9)) nil
#_=> (= o i) (do
#_=> (println)
#_=> (recur (+ 1 o) 1))
#_=> true (recur o (+ 1 i)))))
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81 nil
python中的代码:
print ('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
或者:
for i in range(1,10):
for j in range(1,i+1):
print (str(j),'*',str(i),'=',i*j,end=' ')
print ('\n')
input()
(arr = ([*1..9].map{|i| Array.new(i,i).zip([*1..i])}.flatten)).each_index{|i|puts "#{arr[i]}*#{arr[i+1]}=#{arr[i]*arr[i+1]}" if i%2 == 0}
Ruby1.9.3测试通过,一层循环,一行代码,换行这种小事情就不要计较了
有java么~~我来加个java的~
for (int i = 1, j = 1; i < 10 && j > 0; i++) {
if (j != 10) {
System.out.print(i + "x" + j + "=" + (i * j) + "\t");
}
if (i == j) {
j++;
i = 0;
System.out.println("");
}
}
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
public static void main(String[] args){
print(1,1);
}
public static void print(int i,int j){
if(i>9 || j>9 || j>i)
return ;
if(i==j){
System.out.println(i+”*”+j+”=”+(i*j));
print(i+1,1);
}else{
System.out.print(i+”*”+j+”=”+(i*j)+” “);
print(i,j+1);
}
}
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
(->> (range 1 10)
(map
(fn [n] (map #(format "%sx%s=%s" %1 %2 (* %1 %2))
(range 1 (inc n))
(repeat n))))
flatten)
Clojure,换行神马的就不要纠结了。
我是来凑热闹的!
void print(int x,int y)
{
printf("%d x %d = %d ",x,y,x*y);
fflush(stdout);
if (x == 9 && y == 9) return;
if (x == y) {
putchar('\n');
return print(1,++y);
}
return print(++x,y);
}