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

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

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}	#{"
" 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 .join[ .join[%s*%s=%-2s % y,x,x*y for y in range1,x+1] for x in range1,10]

或者:

for i in range1,10: for j in range1,i+1: print strj,*,stri,=,i*j,end= print input

arr = [*1..9].map{|i| Array.newi,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.printi + "x" + j + "=" + i * j + "	"; } 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 mainString[] args{
print1,1;
}

public static void printint i,int j{
ifi>9 || j>9 || j>i
return ;
ifi==j{
System.out.printlni+”*”+j+”=”+i*j;
printi+1,1;
}else{
System.out.printi+”*”+j+”=”+i*j+” “;
printi,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 printint x,int y
{ printf"%d x %d = %d ",x,y,x*y; fflushstdout; if x == 9 && y == 9 return; if x == y { putchar
; return print1,++y; } return print++x,y;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注