学员3y8246208 发表于 3 天前

打印菱形整数串时超两位数就对不齐求解决方法

本帖最后由 学员3y8246208 于 2025-6-4 20:23 编辑

源码:
#include<stdio.h>
int main(){
        int n,i,j;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
                for(j=1;j<=2*(n-i);j++)
                        printf(" ");
                if(i!=1)
                        printf("1 ");
                for(j=1;j<=i-1;j++)
                        printf("%d ",j+1);
                for(j=1;j<=i-2;j++)
                        printf("%d ",i-j);
                printf("1");
                printf("\n");
        }
        for(i=1;i<=n-1;i++){
                for(j=1;j<=2*i;j++)
                        printf(" ");
                if(i!=n-1)
                        printf("1 ");
                for(j=1;j<=n-i-1;j++)
                        printf("%d ",j+1);
                for(j=1;j<=n-i-2;j++)
                        printf("%d ",n-i-j);
                printf("1");
                printf("\n");
        }
}

打印一位整数未错位:
6
          1
      1 2 1
      1 2 3 2 1
    1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 4 3 2 1
    1 2 3 4 3 2 1
      1 2 3 2 1
      1 2 1
          1

--------------------------------
Process exited after 2.06 seconds with return value 5
请按任意键继续. . .
打印出现两位整数时错位:

20
                                    1
                                    1 2 1
                                  1 2 3 2 1
                              1 2 3 4 3 2 1
                              1 2 3 4 5 4 3 2 1
                            1 2 3 4 5 6 5 4 3 2 1
                        1 2 3 4 5 6 7 6 5 4 3 2 1
                        1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
                      1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
                  1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
                  1 2 3 4 5 6 7 8 9 10 11 10 9 8 7 6 5 4 3 2 1
                1 2 3 4 5 6 7 8 9 10 11 12 11 10 9 8 7 6 5 4 3 2 1
            1 2 3 4 5 6 7 8 9 10 11 12 13 12 11 10 9 8 7 6 5 4 3 2 1
            1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 12 11 10 9 8 7 6 5 4 3 2 1
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
            1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 12 11 10 9 8 7 6 5 4 3 2 1
            1 2 3 4 5 6 7 8 9 10 11 12 13 12 11 10 9 8 7 6 5 4 3 2 1
                1 2 3 4 5 6 7 8 9 10 11 12 11 10 9 8 7 6 5 4 3 2 1
                  1 2 3 4 5 6 7 8 9 10 11 10 9 8 7 6 5 4 3 2 1
                  1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
                      1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
                        1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
                        1 2 3 4 5 6 7 6 5 4 3 2 1
                            1 2 3 4 5 6 5 4 3 2 1
                              1 2 3 4 5 4 3 2 1
                              1 2 3 4 3 2 1
                                  1 2 3 2 1
                                    1 2 1
                                    1

--------------------------------
Process exited after 5.186 seconds with return value 19
请按任意键继续. . .


问题:求打印多位整数也不错位的办法,感谢。

player-none 发表于 3 天前

新建个字符串数组,让每个数以类似" 0"," 1"(空格 n)的形式储存?

FishC 发表于 3 天前

要解决打印菱形整数串时超两位数对不齐的问题,核心是使用固定宽度输出格式(如`%2d`),确保每个数字占据相同字符宽度。同时需调整空格数量以保持居中效果。以下是修改后的代码和说明:

#include <stdio.h>
int main() {
    int n, i, j;
    scanf("%d", &n);
   
    // 计算最大数字宽度(如最大值为(2*n-1)的位数)
    int max_val = 2 * n - 1;
    int w = 1;// 默认宽度
    while (max_val /= 10) w++;// 动态计算所需宽度
    w++;// 增加一位作为间隔
   
    // 上半部分(含中间行)
    for (i = 1; i <= n; i++) {
      // 打印左侧空格(固定宽度倍数)
      for (j = 0; j < w * (n - i); j++)
            printf(" ");
      
      // 打印数字(固定宽度格式)
      for (j = 1; j <= 2*i-1; j++)
            printf("%*d", w, j);// %*d动态设置宽度
      printf("\n");
    }
   
    // 下半部分
    for (i = n-1; i >= 1; i--) {
      for (j = 0; j < w * (n - i); j++)
            printf(" ");
      for (j = 1; j <= 2*i-1; j++)
            printf("%*d", w, j);
      printf("\n");
    }
    return 0;
}

关键修改说明:
1. 动态宽度计算:
   - 通过`while (max_val /= 10) w++;`计算最大数字位数
   - 例如`n=5`时,最大数字是9(1位数),`w=2`;若`n=10`,最大数字19(2位数),`w=3`

2. 固定宽度输出:
   - 用`printf("%*d", w, j)`替代原`%d`,确保每个数字占`w`字符
   - 对齐效果:%2d 使1显示为 1,10显示为10

3. 空格调整:
   - 空格循环改为 w * (n-i),例如`w=2`时空格数量加倍
   - 确保数字增加时整体仍居中

测试示例(输入n=3):
1
1 2 3
1 2 3 4 5
1 2 3
    1
此方法适应任意位数,如需增加数字间隔,可将`w`额外加1(如`w = 计算值 + 1`)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 3 天前

中间空格太少导致的两位数都挤在一起,调大间距即可,

某一个“天” 发表于 3 天前

例如让横向间距为3

行客 发表于 昨天 09:16

#include <stdio.h>

int main() {
    int n, i, j, num;
    scanf("%d", &n);

    // 计算最大数字的位数,用于格式化输出
    int max_num = n;
    int width = 1;
    while (max_num /= 10) width++;

    // 上半部分
    for (i = 1; i <= n; i++) {
      // 前置空格
      for (j = 1; j <= n - i; j++)
            printf("%*s", width + 1, "");

      // 左侧数字序列
      for (j = 1; j <= i; j++)
            printf("%*d ", width, j);

      // 右侧数字序列(倒序,不包括中间和第一个数字)
      for (j = i - 1; j >= 1; j--)
            printf("%*d ", width, j);

      printf("\n");
    }

    // 下半部分
    for (i = n - 1; i >= 1; i--) {
      // 前置空格
      for (j = 1; j <= n - i; j++)
            printf("%*s", width + 1, "");

      // 左侧数字序列
      for (j = 1; j <= i; j++)
            printf("%*d ", width, j);

      // 右侧数字序列(倒序,不包括中间和第一个数字)
      for (j = i - 1; j >= 1; j--)
            printf("%*d ", width, j);

      printf("\n");
    }

    return 0;
}
页: [1]
查看完整版本: 打印菱形整数串时超两位数就对不齐求解决方法