【最新】C语言九九乘法表代码汇总(5种解法,完整代码+详细注释)
九九乘法表是学习 C 语言循环时最经典的练习题,9 行 9 列,结构规整又有规律,特别适合用来练手嵌套循环。
九九乘法表的常见格式一共有 5 种:完整的 9×9 矩形,以及左上、右上、左下、右下四种三角形。很多同学只会照着背其中一种写法,题目一换成就卡住了,说到底是没有抓住每种格式背后的规律。
这篇文章就围绕这 5 种九九乘法表格式展开,逐个讲清楚每种格式到底如何用 C 语言实现。
所以打印的核心就两句话:
这个"外层管行、内层管列、行尾换行"的框架,就是所有变形的出发点。后面四种三角形,都只是在"内层列的范围"和"是否补空格"上做文章。
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") 换行。这一步很容易漏掉,没有它,所有算式会挤在同一行输出。
小结一下,四种三角形的记忆方法:上三角看"列从哪里开始"(j 从 i 开始),下三角看"列到哪里结束"(j 到 i 结束);要靠右输出,就先用空格把前面的位置补上。
【代码六】while 循环实现完整版:
【代码七】do-while 循环实现完整版:
2) 内层循环边界写错。想打印下三角写成 j<=i,想打印上三角写成 j=i; j<=9,两个条件弄反,三角形方向就完全反了。
3) 打印内容写错。把 i*j 写成 i*i 或 j*j,结果每一行(或每一列)的内容都重复,乘法表变成一条条重复的算式。
4) while 版本忘记重置内层变量。内层循环变量 j 只在程序开头初始化一次,第二行开始内层循环直接不执行,只输出一行就结束(详见【代码六】的注意点)。
5) 换行位置放错。把 printf("\n") 写进了内层循环里,会导致每个算式后面都换一次行,变成一列竖排的算式。
打印九九乘法表,只要能把"外层管行、内层管列、行尾换行"这个框架记牢,再理解上三角改列起点、下三角改列终点、靠右输出补空格这三个技巧,考试和作业里关于乘法表的题目基本都能拿下。
声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
九九乘法表的常见格式一共有 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语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。


ICP备案:
公安部网络备案: