打印菱形整数串时超两位数就对不齐求解决方法
本帖最后由 学员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
请按任意键继续. . .
问题:求打印多位整数也不错位的办法,感谢。 新建个字符串数组,让每个数以类似" 0"," 1"(空格 n)的形式储存? 要解决打印菱形整数串时超两位数对不齐的问题,核心是使用固定宽度输出格式(如`%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 #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]