请大家帮我改改关于输出回形数字的程序!

sldarkangel 2004-07-28 12:54:00
前几天在这个论坛上看到一个朋友出的题:
让你设计一个程序,输入N的数值,然后程序会自动输出一个图形,
如N=3时输出:
33333
32223
32123
32223
33333
我设计了一个程序:
#include <stdio.h>
main()
{
int x,y,n,j,m;
m=0;
printf("shu ru n\n");
scanf("%d",&n);
j=n*2-1;
for(x=1;x<=j;x++)
for(y=1;y<=j;y++)
{
if(x==1||y==1||x==j||y==j) printf("%d",n);
else if (x==2||y==2||x==j-1||y==j-1) printf("%d",n-1);
else if (x==3||y==3||x==j-2||y==j-2) printf("%d",n-2);
else if (x==4||y==4||x==j-3||y==j-3) printf("%d",n-3);
else if (x==5||y==5||x==j-4||y==j-4) printf("%d",n-4);
else if (x==6||y==6||x==j-5||y==j-5) printf("%d",n-5);
m++;
if (m%j==0) printf("\n");
}
getch();
}
这个程序上机测试可以通过,不过就是有缺陷:
if(x==1||y==1||x==j||y==j) printf("%d",n);
else if (x==2||y==2||x==j-1||y==j-1) printf("%d",n-1);
else if (x==3||y==3||x==j-2||y==j-2) printf("%d",n-2);
else if (x==4||y==4||x==j-3||y==j-3) printf("%d",n-3);
else if (x==5||y==5||x==j-4||y==j-4) printf("%d",n-4);
else if (x==6||y==6||x==j-5||y==j-5) printf("%d",n-5);
如果对方输入的数值大于6就会出错!当然,可以多加几条else语句把有效输入范围扩大,不过这样还是不实用,请高手帮我改改!谢了!
...全文
127 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowingbf 2004-07-28
  • 打赏
  • 举报
回复
改好了,还是影子传说写的比较强:
我用的是苯方法
#include <stdio.h>
void main()
{
int z[100];
int a,x,y;
printf("shu ru a:\n");
scanf("%d",&a);
x=2*a-1;
y=x;
for(int j=0,k=0;j<x;j++)
{
for(int i=0;i<y;i++)
z[i+k]=a;
for(int i=0;i<x;i++)
{
cout<<z[i];
}
cout<<endl;
if(j<x/2)
{
k++;
a--;
y-=2;
}
else
{
a++;
y+=2;
k--;}
}
}
sldarkangel 2004-07-28
  • 打赏
  • 举报
回复
谢谢各位了!我刚刚受 snowingbf的启发,改进了一下我的程序!
#include<stdio.h>
main()
{
int x,y,n,j,k,l,o,m,z;
m=0;
printf("shu ru n\n");
scanf("%d",&n);
j=n*2-1;
for(x=1;x<=j;x++)
for(y=1;y<=j;y++)
{k=1;
l=j;
o=n;
for(z=1;z<=n;z++)
{
if(x==k||y==k||x==l||y==l)
{printf("%3d",o);
break;
}
else{k++;
l--;
o--;
}
}
m++;
if (m%j==0) printf("\n");
}
getch();
}
这样就能解决问题了!上机测试通过!
snowingbf 2004-07-28
  • 打赏
  • 举报
回复
#include <iostream.h>
void main()
{
int z[100];
int a,x;
cin>>a;
x=2*a-1;
int y=x;
int b=a;
cout<<x<<endl;

for(int j=0,k=0;j<x;j++)
{
for(int i=0;i<y;i++)
z[i+k]=b;
for(int i=0;i<x;i++)
{
cout<<z[i];
}
cout<<endl;
if(j<x/2)
{
k++;
b--;
y-=2;
}
else
{
b++;
y+=2;
k--;}
}
system("pause");

}
insiku 2004-07-28
  • 打赏
  • 举报
回复
如果是偶数 是什么图形
pacman2000 2004-07-28
  • 打赏
  • 举报
回复
for (i=1;i<=2*n-1;i++)
{
for (j=0;j<=2*n-1;j++)
printf("%d",max(abs(n-i)+1,abs(n-j)+1));
printf("\n");
}

max和abs可以参照math.h里,或者自己写一个也行。
pacman2000 2004-07-28
  • 打赏
  • 举报
回复
第i行,(i从1到2n-1)
第j列,(j从1到2n-1)
输出的数字是:max(abs(n-i)+1,abs(n-j)+1)
wodeyouxian 2004-07-28
  • 打赏
  • 举报
回复
不是很看得出数据之间的输出进规律,要不楼主再举几个例子吧
sldarkangel 2004-07-28
  • 打赏
  • 举报
回复
对了,还有一点忘说了,小弟现在正在学C,所以请大哥们用C写,谢谢了!
sldarkangel 2004-07-28
  • 打赏
  • 举报
回复
就是说用递归写吗?各位大哥能不能改个完整的程序出来?麻烦你们了!
pacman2000 2004-07-28
  • 打赏
  • 举报
回复
对于n,是个2n-1的正方形。里面的递减规律也比较好判断。取max()就可以了。
snowingbf 2004-07-28
  • 打赏
  • 举报
回复
用循环写

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧