如何打印指定箭头图案?输入10~16间奇数的数字对齐问题
10~16奇数箭头图案的数字对齐问题
需求:输入10~16之间的奇数,打印指定样式箭头图案,目前已能通过循环打印数字,但无法实现数字对齐。
用户提供的C语言代码:
#include <stdio.h> int n; int i,j; int main(){ printf("(n): "); scanf("%d",&n); int multiplier = n/2+1; printf(" "); for(i=1;i<n+1;i++){ printf(" %d ",i); } printf("\n"); for(i=1;i<(n/2)+2;i++){ printf("%d ",i); multiplier = multiplier - i +1; for(j=1;j<(i*2);j++){; printf(" %2d ",multiplier*i); multiplier = multiplier+1; } printf("\n"); multiplier = n/2+1; } for(i=7;i<n+1;i++){ printf("%d ",i); multiplier = 5; for(j=0;j<3;j++){ printf("%d ",multiplier*i); multiplier += 1; } printf("\n"); } }
调整方案:统一格式化输出宽度
数字对齐的核心是为每个数字分配固定的输出宽度,避免因数字位数(1位/2位)变化导致错位。可通过以下几点修改:
统一表头和内容的输出宽度
表头数字和每行的乘积数字都使用固定宽度格式化输出,比如%3d(占3个字符宽度,右对齐),确保每个数字的占位一致。修正行首的对齐逻辑
第一行表头的前置空格需和后续行的行首数字宽度匹配,行首数字也用固定宽度输出,避免打乱整体对齐。修复下半部分循环的硬编码问题
原代码下半部分用了硬编码的i=7和multiplier=5,仅适配特定n值,需改成基于n的动态计算,同时统一输出格式。
修改后的代码:
#include <stdio.h> int main(){ int n, i, j; printf("(n): "); scanf("%d", &n); // 打印表头,每个数字占3位宽度 printf(" "); // 对应行首数字的3位宽度 for(i=1; i<=n; i++){ printf("%3d", i); } printf("\n"); int mid = n/2 + 1; // 打印上半部分箭头 for(i=1; i<=mid; i++){ // 行首数字占3位宽度 printf("%3d", i); int start = mid - i + 1; // 打印i*start到i*(start+2i-2),每个占3位 for(j=0; j<2*i-1; j++){ printf("%3d", i*(start + j)); } printf("\n"); } // 打印下半部分箭头 for(i=mid+1; i<=n; i++){ printf("%3d", i); int start = mid - (n - i + 1) + 1; int count = 2*(n - i + 1) - 1; for(j=0; j<count; j++){ printf("%3d", i*(start + j)); } printf("\n"); } }
关键说明:
%3d格式化输出确保每个数字(1位或2位)都占用3个字符宽度,右对齐后自然实现列对齐。- 上半部分和下半部分的起始乘数、打印数量都基于
n的中间值mid动态计算,适配10~16之间的所有奇数。 - 表头前置的
" "和行首的%3d宽度一致,保证第一列对齐。
内容的提问来源于stack exchange,提问作者JoshFang9467
相关产品推荐
相关产品推荐

