作者:解学武

【最新】C语言九九乘法表代码汇总(5种解法,完整代码+详细注释)

九九乘法表是学习 C 语言循环时最经典的练习题,9 行 9 列,结构规整又有规律,特别适合用来练手嵌套循环。

九九乘法表的常见格式一共有 5 种:完整的 9×9 矩形,以及左上、右上、左下、右下四种三角形。很多同学只会照着背其中一种写法,题目一换成就卡住了,说到底是没有抓住每种格式背后的规律。

这篇文章就围绕这 5 种九九乘法表格式展开,逐个讲清楚每种格式到底如何用 C 语言实现。

文章内容取自:C语言入门教程:零基础学会C语言(2026版)

九九乘法表结构分析

完整的九九乘法表共 9 行 9 列,其中第 i 行第 j 列的内容是 i × j 的结果。举个例子:第 3 行第 4 列就打印 3*4=12。


所以打印的核心就两句话:
  • 外层循环控制行(i 从 1 到 9),内层循环控制列(j 从 1 到 9);
  • 每打印完一行的所有列,就输出一个换行符 \n,让下一行从新的一行开始。

这个"外层管行、内层管列、行尾换行"的框架,就是所有变形的出发点。后面四种三角形,都只是在"内层列的范围"和"是否补空格"上做文章。

打印完整九九乘法表

【代码一】输出完整的 9×9 乘法表:
#include <stdio.h>
int main(){
    int i, j;
    for(i=1; i<=9; i++){        // 外层循环:控制行数,共 9 行
        for(j=1; j<=9; j++){    // 内层循环:控制列数,每行 9 列
            printf("%d*%d=%2d  ", i, j, i*j);
        }
        printf("\n");           // 一行打印完,换行
    }
    return 0;
}
运行结果:
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9 
2*1= 2  2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18 
3*1= 3  3*2= 6  3*3= 9  3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27 
4*1= 4  4*2= 8  4*3=12  4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36 
5*1= 5  5*2=10  5*3=15  5*4=20  5*5=25  5*6=30  5*7=35  5*8=40  5*9=45 
6*1= 6  6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  6*7=42  6*8=48  6*9=54 
7*1= 7  7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  7*8=56  7*9=63 
8*1= 8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72 
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 
逐句分析这段代码:
1) for(i=1; i<=9; i++) 是外层循环,i 表示当前打印第几行。i 从 1 开始,每循环一轮加 1,直到 i 等于 9 打印完最后一行。

2) for(j=1; j<=9; j++) 是内层循环,j 表示当前行的第几列。对于每一行,j 都要从 1 重新数到 9,所以内层循环完整地嵌在外层循环的循环体里。

3) printf("%d*%d=%2d ", i, j, i*j) 是真正打印的地方。%d 依次对应 i、j、i*j 三个整数;%2d 表示结果至少占 2 个字符宽度、右对齐,这样个位数的结果(比如 6)前面会补一个空格,和两位数的结果(比如 12)对齐。算式后面再补两个空格,让每个算式在屏幕上固定占 8 个字符,整张表看起来就是整齐的网格。

4) 内层循环结束后,printf("\n") 换行。这一步很容易漏掉,没有它,所有算式会挤在同一行输出。

打印上三角(左上、右上)

1)打印左上三角

【代码二】左上三角形:内层循环的列直接从 i 开始。
#include <stdio.h>
int main(){
    int i, j;
    for(i=1; i<=9; i++){
        for(j=i; j<=9; j++){    // 关键改动:列从 i 开始,跳过 j<i 的部分
            printf("%d*%d=%2d  ", i, j, i*j);
        }
        printf("\n");
    }
    return 0;
}
运行结果:
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9 
2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18 
3*3= 9  3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27 
4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36 
5*5=25  5*6=30  5*7=35  5*8=40  5*9=45 
6*6=36  6*7=42  6*8=48  6*9=54 
7*7=49  7*8=56  7*9=63 
8*8=64  8*9=72 
9*9=81 
和完整版相比只改了一处:内层循环的起点从 j=1 变成了 j=i。第 i 行从 i*1、i*2 一直打印到 i*(i-1) 的部分被跳过,直接输出 i*i 开始的算式。

2)打印右上三角

【代码三】右上三角形:在打印算式之前,先把前面空缺的 (i-1) 列用空格补上,让内容整体向右推。
#include <stdio.h>
int main(){
    int i, j, k;
    for(i=1; i<=9; i++){
        for(k=1; k<=i-1; k++)  // 先补 (i-1) 个空位,每个空位 8 个空格
            printf("        ");
        for(j=i; j<=9; j++)    // 再打印本行剩下的算式
            printf("%d*%d=%2d  ", i, j, i*j);
        printf("\n");
    }
    return 0;
}
运行结果:
1*1= 1  1*2= 2  1*3= 3  1*4= 4  1*5= 5  1*6= 6  1*7= 7  1*8= 8  1*9= 9 
        2*2= 4  2*3= 6  2*4= 8  2*5=10  2*6=12  2*7=14  2*8=16  2*9=18 
                3*3= 9  3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27 
                        4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36 
                                5*5=25  5*6=30  5*7=35  5*8=40  5*9=45 
                                        6*6=36  6*7=42  6*8=48  6*9=54 
                                                7*7=49  7*8=56  7*9=63 
                                                        8*8=64  8*9=72 
                                                                9*9=81 
原理:每个算式固定占 8 个字符,空位也补 8 个空格,这样第 i 行的内容就和完整表里第 i 行的位置一一对应,空缺部分全部在左边,三角形就"靠右"了。

打印下三角(左下、右下)

1)打印左下三角

【代码四】左下三角形:内层循环的列到 i 就停。
#include <stdio.h>
int main(){
    int i, j;
    for(i=1; i<=9; i++){
        for(j=1; j<=i; j++){    // 关键改动:列只到 i 为止
            printf("%d*%d=%2d  ", i, j, i*j);
        }
        printf("\n");
    }
    return 0;
}
运行结果:
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 
这是初学者最先学会、也最常考的下三角写法:第 i 行打印 i 个算式,也就是 1×1 到 i×i。

2)打印右下三角

【代码五】右下三角形:先补 (9-i) 个空位,再打印算式,让三角形整体靠右。
#include <stdio.h>
int main(){
    int i, j, k;
    for(i=1; i<=9; i++){
        for(k=1; k<=9-i; k++)  // 先补 (9-i) 个空位
            printf("        ");
        for(j=1; j<=i; j++)    // 再打印本行的 i 个算式
            printf("%d*%d=%2d  ", i, j, i*j);
        printf("\n");
    }
    return 0;
}
运行结果:
                                                                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 
第 i 行有 9-i 个空位加上 i 个算式,加起来正好铺满 9 列的宽度,最后一行(i=9)没有空位,输出完整的 9 个算式。

小结一下,四种三角形的记忆方法:上三角看"列从哪里开始"(j 从 i 开始),下三角看"列到哪里结束"(j 到 i 结束);要靠右输出,就先用空格把前面的位置补上。

用while和do-while改写

for 循环的三个表达式(初始化、条件、步进)拆开写,就是 while 循环。只要记住"内层循环的 j 每行都要重新初始化"这一点,改写就不会出错。

【代码六】while 循环实现完整版:
#include <stdio.h>
int main(){
    int i = 1, j;
    while(i <= 9){
        j = 1;                  // 关键:每行开始前都要把 j 重置为 1
        while(j <= 9){
            printf("%d*%d=%2d  ", i, j, i*j);
            j++;
        }
        printf("\n");
        i++;
    }
    return 0;
}
运行结果与【代码一】完全相同。注意 j = 1; 必须写在 while 循环体内部、内层 while 的前面——如果写在 main 函数开头只初始化一次,第二行开始 j 会一直停留在 10,内层循环直接不执行,后面的行全空。

【代码七】do-while 循环实现完整版:
#include <stdio.h>
int main(){
    int i = 1, j;
    do{
        j = 1;
        do{
            printf("%d*%d=%2d  ", i, j, i*j);
            j++;
        }while(j <= 9);
        printf("\n");
        i++;
    }while(i <= 9);
    return 0;
}
运行结果同样与【代码一】完全相同。do-while 的特点是"先执行一次循环体再判断条件",这里内外层都至少会执行一次,效果和 while 一致。三种循环写出来的程序结构不同,但打印结果完全一样,这正说明"循环的本质是同一件事,选哪种写法看习惯"。

进阶:只用一层循环也能打印

这种写法笔试里偶尔会考,能看懂即可,平时还是推荐用嵌套循环,可读性好得多。

九九乘法表一共 81 个算式,如果不用嵌套循环,也可以把这 81 个算式当成一条长串,用一个循环变量 k 从 1 数到 81,再根据 k 反推出它属于第几行第几列:
#include <stdio.h>
int main(){
    int k, i, j;
    for(k=1; k<=81; k++){
        i = (k-1)/9 + 1;    // 由序号反推行号
        j = (k-1)%9 + 1;    // 由序号反推列号
        printf("%d*%d=%2d  ", i, j, i*j);
        if(j == 9)          // 数到每行的最后一列就换行
            printf("\n");
    }
    return 0;
}
运行结果与【代码一】完全相同。思路是:第 1 个算式是第 1 行第 1 列,第 10 个算式是第 2 行第 1 列——用整除求行号、取余求列号,j 等于 9 时说明一行结束,补一个换行。

新手常见错误汇总

1) 忘记换行。内层循环结束后没有 printf("\n"),所有算式全部挤在一行,这是最常见的错误。

2) 内层循环边界写错。想打印下三角写成 j<=i,想打印上三角写成 j=i; j<=9,两个条件弄反,三角形方向就完全反了。

3) 打印内容写错。把 i*j 写成 i*i 或 j*j,结果每一行(或每一列)的内容都重复,乘法表变成一条条重复的算式。

4) while 版本忘记重置内层变量。内层循环变量 j 只在程序开头初始化一次,第二行开始内层循环直接不执行,只输出一行就结束(详见【代码六】的注意点)。

5) 换行位置放错。把 printf("\n") 写进了内层循环里,会导致每个算式后面都换一次行,变成一列竖排的算式。

总结

九九乘法表虽然简单,但它把 C 语言循环的三大考点全占了:嵌套循环的结构、循环变量的边界控制、输出的格式控制(%2d 和换行)。

打印九九乘法表,只要能把"外层管行、内层管列、行尾换行"这个框架记牢,再理解上三角改列起点、下三角改列终点、靠右输出补空格这三个技巧,考试和作业里关于乘法表的题目基本都能拿下。

声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。

添加微信咨询 加站长微信免费领
C语言学习小册
加站长微信免费领C语言学习小册
微信ID:xiexuewu333