关于用C语言打印菱形图形的算法思路?
大神还在吗?请教你关于菱形图形的算法思路,下面是有两则都是你回答的都是打印菱形图形的代码:代码1:#include<stdio.h>#include<math.h>int...
大神还在吗?请教你关于菱形图形的算法思路,下面是有两则都是你回答的都是打印菱形图形的代码:
代码1:
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k;
for(i=0;i<5;i++) // 我知道这里是控制行数的
{
for(j=0,k=0;j<2*5-1;j++) // 1、能否详细地解释下2*5-1的意思吗?
{
if(i>=(2*5-1)/2-j&&j<=4) // 2、这个表达式是什么意思?
{
k++;
printf("%d",k);
}
else if(j-(2*5-1)/2<=i&&j>4)// 3、这个表达式是什么意思?
{
k--;
printf("%d",k);
}
else
{
printf(" ");
}
}
printf("\n");
}
4、能整体详细地解释下你的思路么?
代码2:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,j,n,temp;
cout<<"请输入n:";
cin>>n;
for(i=0;i<2*n-1;i++)
{
temp=1;
for(j=0;j<2*n-1;j++) // 1、内层循环为什么要用2*n-1即与菱形的行数一样?
{
if((i<n&&abs(n-1-j)<=i)||(i>=n&&abs(n-1-j)<2*n-1-i)) //2、分别解释下这两个表达式为什么要这样?我只知道i<n是控制菱形的上半部分,相应地i>=n是控制下半部分的,(n-1-j)取绝对值是什么意思? {
cout<<(j<n-1?temp++:temp--);
}
else
cout<<" ";
}
cout<<endl;
}
return 0;
}
麻烦大神解释清楚点,谢谢!
最重的是要大神的思路。 展开
代码1:
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k;
for(i=0;i<5;i++) // 我知道这里是控制行数的
{
for(j=0,k=0;j<2*5-1;j++) // 1、能否详细地解释下2*5-1的意思吗?
{
if(i>=(2*5-1)/2-j&&j<=4) // 2、这个表达式是什么意思?
{
k++;
printf("%d",k);
}
else if(j-(2*5-1)/2<=i&&j>4)// 3、这个表达式是什么意思?
{
k--;
printf("%d",k);
}
else
{
printf(" ");
}
}
printf("\n");
}
4、能整体详细地解释下你的思路么?
代码2:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,j,n,temp;
cout<<"请输入n:";
cin>>n;
for(i=0;i<2*n-1;i++)
{
temp=1;
for(j=0;j<2*n-1;j++) // 1、内层循环为什么要用2*n-1即与菱形的行数一样?
{
if((i<n&&abs(n-1-j)<=i)||(i>=n&&abs(n-1-j)<2*n-1-i)) //2、分别解释下这两个表达式为什么要这样?我只知道i<n是控制菱形的上半部分,相应地i>=n是控制下半部分的,(n-1-j)取绝对值是什么意思? {
cout<<(j<n-1?temp++:temp--);
}
else
cout<<" ";
}
cout<<endl;
}
return 0;
}
麻烦大神解释清楚点,谢谢!
最重的是要大神的思路。 展开
3个回答
展开全部
我说一下第二个,其实第一个和第二个思路是一样的。
1.外面的for循环,用i控制行数,输入整数为n,则整个图形的行数为2*n-1,列数也是一样的,你可以看看,就是说行数和列数是一样的,所以内层循环和外层循环都是2*n-1,不信的话,你可以查查图形的行列数。
2.i<n是控制菱形的上半个部分,i>=n是控制下半个部分。因为0<=j<=2*n-1,就是说j可以大于n-1,也可以小于n-1。n-1是真个图形最中间的那一列,整个图形关于这一列对称。当i<n时,第一行,只有中间这一列有数字,第二行,中间这一列有数字,并且这一列每一边都有一列数字,第三行,中间这一列有数字,并且这一列每一边都有两列数字。。。。。所以,你懂了吧,abs(n-1-j)就是看第j列距离中间这一列的距离是多少,第一列距离是0,第二列距离是1,第三列距离是2。。。。当i>=n时,道理是一样的,随着i的增大,每一行都会少两个数字,并且少的数字位置关于中间这一列对称。所以要abs(n-1-j)<2*n-1-i,i>=n时,i每增大1,2*n-1-i都会减少1,abs(n-1-j)都会减少两个列,并且减少的两个列关于中间对称,你可以自己算算是不是这个道理。
还有没有其他不懂得?
1.外面的for循环,用i控制行数,输入整数为n,则整个图形的行数为2*n-1,列数也是一样的,你可以看看,就是说行数和列数是一样的,所以内层循环和外层循环都是2*n-1,不信的话,你可以查查图形的行列数。
2.i<n是控制菱形的上半个部分,i>=n是控制下半个部分。因为0<=j<=2*n-1,就是说j可以大于n-1,也可以小于n-1。n-1是真个图形最中间的那一列,整个图形关于这一列对称。当i<n时,第一行,只有中间这一列有数字,第二行,中间这一列有数字,并且这一列每一边都有一列数字,第三行,中间这一列有数字,并且这一列每一边都有两列数字。。。。。所以,你懂了吧,abs(n-1-j)就是看第j列距离中间这一列的距离是多少,第一列距离是0,第二列距离是1,第三列距离是2。。。。当i>=n时,道理是一样的,随着i的增大,每一行都会少两个数字,并且少的数字位置关于中间这一列对称。所以要abs(n-1-j)<2*n-1-i,i>=n时,i每增大1,2*n-1-i都会减少1,abs(n-1-j)都会减少两个列,并且减少的两个列关于中间对称,你可以自己算算是不是这个道理。
还有没有其他不懂得?
追问
1、这里是不是有误:“abs(n-1-j)就是看第j列距离中间这一列的距离是多少,第一列距离是0,第二列距离是1,第三列距离是2。。。。”假设n=4,则应该是:“就是看第j列距离中间这一列的距离是多少,第一列距离是3(4-1-0),第二列距离是2(4-1-1),第三列距离是1(4-1-2),第四列距离是0(4-1-3)刚好是正中间列并且<=0” ?
追答
没有错误啊,n=4时,就是2*4-1=9行,9列的。第一列距离就是3,第二列就是2,第三列就是1,第四列是0,就是中间这一列。
当i=n并且abs(n-1-j)<2*n-1-i,当i=4时,2*n-1-i=3,j=1,2,3,4,5,这五列可以显示。当i=5时,只有j=2,3,4这三列可以显示。。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
东莞大凡
2024-08-07 广告
2024-08-07 广告
作为东莞市大凡光学科技有限公司的一员,我们深知Matlab圆点标定板在相机标定中的重要性。该标定板通过均匀分布的圆点,帮助精确计算相机参数,优化成像效果。Matlab强大的编程功能,使得我们能够灵活设计标定板,调整圆点大小、数量和分布,以满...
点击进入详情页
本回答由东莞大凡提供
展开全部
int n = 6;
for (int i =1;i<=2*n-1;i++){
for (int j=1;j<=2*n-1;j++){
if ((i<=n&&(j==n-(i-1)||j==n+(i-1)))|| (i>n&&(j==n+(2*n-i-1)||j==n-(2*n-i-1)))){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}
for (int i =1;i<=2*n-1;i++){
for (int j=1;j<=2*n-1;j++){
if ((i<=n&&(j==n-(i-1)||j==n+(i-1)))|| (i>n&&(j==n+(2*n-i-1)||j==n-(2*n-i-1)))){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.print("\n");
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虽然这不是我写的,但我还是能看懂点
你可以自己用算术推导一下每行的空格,*的个数
然后就是朴素的模拟
你可以自己用算术推导一下每行的空格,*的个数
然后就是朴素的模拟
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询