鱼C论坛

 找回密码
 立即注册
查看: 226|回复: 5

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

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

源码:
  1. #include<stdio.h>
  2. int main(){
  3.         int n,i,j;
  4.         scanf("%d",&n);
  5.         for(i=1;i<=n;i++){
  6.                 for(j=1;j<=2*(n-i);j++)
  7.                         printf(" ");
  8.                 if(i!=1)
  9.                         printf("1 ");
  10.                 for(j=1;j<=i-1;j++)
  11.                         printf("%d ",j+1);
  12.                 for(j=1;j<=i-2;j++)
  13.                         printf("%d ",i-j);
  14.                 printf("1");
  15.                 printf("\n");
  16.         }
  17.         for(i=1;i<=n-1;i++){
  18.                 for(j=1;j<=2*i;j++)
  19.                         printf(" ");
  20.                 if(i!=n-1)
  21.                         printf("1 ");
  22.                 for(j=1;j<=n-i-1;j++)
  23.                         printf("%d ",j+1);
  24.                 for(j=1;j<=n-i-2;j++)
  25.                         printf("%d ",n-i-j);
  26.                 printf("1");
  27.                 printf("\n");
  28.         }
  29. }
复制代码

打印一位整数未错位:
  1. 6
  2.           1
  3.         1 2 1
  4.       1 2 3 2 1
  5.     1 2 3 4 3 2 1
  6.   1 2 3 4 5 4 3 2 1
  7. 1 2 3 4 5 6 5 4 3 2 1
  8.   1 2 3 4 5 4 3 2 1
  9.     1 2 3 4 3 2 1
  10.       1 2 3 2 1
  11.         1 2 1
  12.           1

  13. --------------------------------
  14. Process exited after 2.06 seconds with return value 5
  15. 请按任意键继续. . .
复制代码

打印出现两位整数时错位:

  1. 20
  2.                                       1
  3.                                     1 2 1
  4.                                   1 2 3 2 1
  5.                                 1 2 3 4 3 2 1
  6.                               1 2 3 4 5 4 3 2 1
  7.                             1 2 3 4 5 6 5 4 3 2 1
  8.                           1 2 3 4 5 6 7 6 5 4 3 2 1
  9.                         1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
  10.                       1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
  11.                     1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
  12.                   1 2 3 4 5 6 7 8 9 10 11 10 9 8 7 6 5 4 3 2 1
  13.                 1 2 3 4 5 6 7 8 9 10 11 12 11 10 9 8 7 6 5 4 3 2 1
  14.               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
  15.             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
  16.           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
  17.         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
  18.       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
  19.     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
  20.   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
  21. 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
  22.   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
  23.     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
  24.       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
  25.         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
  26.           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
  27.             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
  28.               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
  29.                 1 2 3 4 5 6 7 8 9 10 11 12 11 10 9 8 7 6 5 4 3 2 1
  30.                   1 2 3 4 5 6 7 8 9 10 11 10 9 8 7 6 5 4 3 2 1
  31.                     1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
  32.                       1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
  33.                         1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
  34.                           1 2 3 4 5 6 7 6 5 4 3 2 1
  35.                             1 2 3 4 5 6 5 4 3 2 1
  36.                               1 2 3 4 5 4 3 2 1
  37.                                 1 2 3 4 3 2 1
  38.                                   1 2 3 2 1
  39.                                     1 2 1
  40.                                       1

  41. --------------------------------
  42. Process exited after 5.186 seconds with return value 19
  43. 请按任意键继续. . .
复制代码


问题:求打印多位整数也不错位的办法,感谢。
最佳答案
前天 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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
新建个字符串数组,让每个数以类似" 0"," 1"(空格 n)的形式储存?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. #include <stdio.h>
  2. int main() {
  3.     int n, i, j;
  4.     scanf("%d", &n);
  5.    
  6.     // 计算最大数字宽度(如最大值为(2*n-1)的位数)
  7.     int max_val = 2 * n - 1;
  8.     int w = 1;  // 默认宽度
  9.     while (max_val /= 10) w++;  // 动态计算所需宽度
  10.     w++;  // 增加一位作为间隔
  11.    
  12.     // 上半部分(含中间行)
  13.     for (i = 1; i <= n; i++) {
  14.         // 打印左侧空格(固定宽度倍数)
  15.         for (j = 0; j < w * (n - i); j++)
  16.             printf(" ");
  17.         
  18.         // 打印数字(固定宽度格式)
  19.         for (j = 1; j <= 2*i-1; j++)
  20.             printf("%*d", w, j);  // %*d动态设置宽度
  21.         printf("\n");
  22.     }
  23.    
  24.     // 下半部分
  25.     for (i = n-1; i >= 1; i--) {
  26.         for (j = 0; j < w * (n - i); j++)
  27.             printf(" ");
  28.         for (j = 1; j <= 2*i-1; j++)
  29.             printf("%*d", w, j);
  30.         printf("\n");
  31.     }
  32.     return 0;
  33. }
复制代码


关键修改说明:
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.   1 2 3
  3. 1 2 3 4 5
  4.   1 2 3
  5.     1
复制代码

此方法适应任意位数,如需增加数字间隔,可将`w`额外加1(如`w = 计算值 + 1`)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 4 天前 | 显示全部楼层
中间空格太少导致的两位数都挤在一起,调大间距即可,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
例如让横向间距为3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 08:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表