如何只用一次循环输出完整的九九表?

14次阅读

只用一次循环输出如下的内容

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 循环内部控制循环的结束 …

虽然代码看起来比两次循环要少 … 但事实上时间复杂度是一样的 …

其实吧 … 生成乘法表的方法有很多种 … 甚至不需要循环都可以解决 …

使用单次循环解决的方法也不仅仅只有我这一种 … 我能想到的至少还有两三种 …

我写这一个版本 … 其他的留给别人好啦 …

没有实现不了 … 关键点就是在创意恩恩 …

Sunyanzi

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

Ever

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吗

Cam

来个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

pf_miles

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()

tealin

(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测试通过,一层循环,一行代码,换行这种小事情就不要计较了

Zumi_Kua

有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

lee80386

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

li_an_tan

(->> (range 1 10)
           (map
            (fn [n] (map #(format "%sx%s=%s" %1 %2 (* %1 %2))
                         (range 1 (inc n))
                         (repeat n))))
           flatten)

Clojure,换行神马的就不要纠结了。

Kyle_Feng

我是来凑热闹的!

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

leunggamciu

正文完