玖叶教程网

前端编程开发入门

如何用一个循环语句输出九九乘法表?

极限挑战:用一条循环语句正确输出99表!

不能用 if switch 之类的控制语句

只是想知道怎么只用一个 for 实现的


展示一下 C++ 17 的 fold expression:

#include <utility>#include <iostream>template<int... I>void OutputImpl(std::integer_sequence<int, I...>, int x){

作者:苦逼小青年

链接:https://www.zhihu.com/question/55768263/answer/146636640

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其实另外一种思路是,给乘法表的每一个cell编号从0到45,然后构造一个函数f(n)使得这个函数返回这个编号的cell应该在哪一行那一列。

注意到前N行一共有

个cell,并且这个函数是在N > 0 的时候是单调的

所以

于是,可以得到如下解法:

Python

import math

C

#include <stdio.h>#include <math.h>int main(){

Scala

(0 to 44) map (x => {

===

再补充一个混乱版的,既然大家都想写得短

#include <stdio.h>#include <math.h>int r,c;int main(int i){

作者:苦逼小青年

链接:https://www.zhihu.com/question/55768263/answer/146636640

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

再更,既然有人质疑不能用SQRT,那么只好祭出大杀器Fast inverse square root

float Q_rsqrt( float number ){

但是这段代码是算1/sqrt(x)的,怎么办?其实前面几行是估算1/sqrt(x)的值,这一段可以用,然后我们有牛顿迭代法

其中

float Q_rsqrt( float number )

把这段代码压缩成紧凑的形式

union { float f; long l; } v;

然后替换sqrt函数

#include <stdio.h>union { float f; long l; } v;int r,c; void s(float t){

最后增加一个终极蛋疼版

#include <stdio.h>union { float f; long l; } v;int r,c; int main(int i) {

或者模仿IOCCC来一个

union{float f;long l;}v;int r,c;int main(int i){return v.f=8*i-7,v.l=0x5f3759df-v.l/2,r=0.5+0.25/v.f+(2*i-1.75)*v.f,c=i-(r-1)*r/2,printf("%d*%d=%d""%c",c,r,c*r,32-22*(r==c)),i-45&&main(i+1);}

作者:Falccm

链接:https://www.zhihu.com/question/55768263/answer/146622326

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

MATLAB:

>> for k = 1 : 9, disp((1 : k) * k), end

如果不必须有循环可以用 arrayfun:

arrayfun(@(k) disp((1 : k) * k), 1 : 9)

--------更新--------

如果需要带表达式,也是类似的:

>> for k = 1 : 9, disp(join(string(k) + '*' + (1 : k) + '=' + (1 : k) * k)), end1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94*1=4 4*2=8 4*3=12 4*4=165*1=5 5*2=10 5*3=15 5*4=20 5*5=256*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=367*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*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

同样可以改写为:

arrayfun(@(k) disp(join(string(k) + '*' + (1 : k) + '=' + (1 : k) * k)), 1 : 9)

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言