令人头疼的菱形……
一、堂前习题
1.由键盘输入正数n(n<30),要求输出如下2*n+1行的菱形图案。
输出格式 菱形右边不留多余空格
输入样例 2
输出样例
*
***
*****
***
*
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n,i,j;//这种题关键在于找规律,我一般是对照着菱形图案,用具体的数字举例来找到规律
scanf("%d",&m);//假设输入半层数--3
n = m+1;//最中间层数--4
for(i=1-n;i<=m;i++)//-3;-3<=3;刚好打印7层
{//第几层
for(j=0;j<abs(i);j++)
printf(" ");//先输入三个空格
for(j=0;j<2*(n-abs(i))-1;j++)//j<2*(4-3)-1
printf("*");//再输入*数
printf("\n");//记得换行
}
return 0;
}
假如n代表的是菱形的总行数(奇数),那么应该写成:
#include<stdio.h>
int main()
{
int i = 0,j = 0,n = 0;
scanf("%d",&n);//同样是对着菱形图案举例,并且下面判断循环所用的数学式子并不唯一
for(i=0;i<=n/2;i++)
{
for(j=0;j<(n/2-i);j++)
{
printf(" ");
}
for(j=0;j<2*i+1;j++)
{
printf("*");
}
printf("\n");
}
for(i=0;i<n/2;i++)
{
for(j=0;j<i+1;j++)
{
printf(" ");
}
for(j=0;j<n-2*(i+1);j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
再假如n是半个菱形的行数,包含最中间的那行,比如上面的示例菱形n就等于3
#include <stdio.h>
int main()
{
int line = 0;
scanf("%d",&line);//line为半个菱形行数(包括最中间)
//打印上半部分
int i = 0;
for(i=0;i<line;i++)//打印line行
{
//打印空格
int j = 0;
for(j=0;j<line-1-i;j++)
{
printf(" ");
}
//打印*
for(j = 0;j<2*i+1;j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
for(i=0;i<line-1;i++)
{
int j = 0;
//打印空格
for(j=0;j<=i;j++)
{
printf(" ");
}
//打印*
for(j=0;j<2*(line-1-i)-1;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
二、堂上练习
1.输出2到200之间(包括2、200)的所有素数(注:要求1行1个素数,按由小到大的顺序输出)。
输入样例
(无)
输出样例
2
3
5
7
……
199
代码如下(示例):
#include<stdio.h>
#include<math.h>
int main()
{
int m,k,i;
for(m=2; m<=200; m++)
{
k=sqrt(m);
for(i=2; i<=k; i++)//为什么不把这里的k换成上面的sqrt(m),然后上一行可以去掉,这样代码不是更加简洁吗
if(m%i==0)
break;
if(i>k)
printf("%d\n",m);
}
return 0;
}
这里回答注释中的问题,因为替换之后每进行一次i的循环,sqrt就得执行一次,而没有替换前的仅仅只是在内层for循环开始前执行了一次而已,所以看上去代码简洁了一点,实际上运行所花的时间更多。
2.输出1到9999中能被7整除,而且至少有一位数字是5的所有数字
输出格式 一行一个
输出样例
35
56
105
154
…
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
for(i=7;i<=9999;i+=7)//只有7的倍数才能被7整除
{
j=i;//找j当替身,
while(j!=0)
{
if(j%10==5)
{
printf("%d\n",i);//遇到5就打印
break;//遇到就跳出循环
}
j /= 10;//遇不到就下一位
}
}
return 0;
}
3.由键盘输入正数n(n<10),要求输出如下中间数字为n的菱形图案。
输出格式 菱形右边不留多余空格
输入样例 4
输出样例
1
121
12321
1234321
12321
121
1
代码如下(示例):
#include<stdio.h>
int main()
{
int i,j,n;
scanf("%d",&n);//方法同上
//打印上层
for(i=1;i<=n;i++)//包括最中间那行
{
for(j=0;j<n-i;j++)
printf(" ");
for(j=1;j<=i;j++)//打印左边
printf("%d",j);
for(j=i-1;j>=1;j--)//打印右边
printf("%d",j);
printf("\n");
}
//打印下层
for(i=1;i<n;i++)//不包括最中间那行
{
for(j=0;j<i;j++)
printf(" ");
for(j=1;j<=n-i;j++)
printf("%d",j);
for(j=n-i-1;j>=1;j--)
printf("%d",j);
printf("\n");
}
return 0;
}
三、单元测试
1.由键盘输入n(n为正奇数,n<=50),打印输出如下图n行的星号空心菱形
例n=7
*
* *
* *
* *
* *
* *
*
输入格式 一个正奇数
输出格式 如题星号空心菱形,菱形上部不允许有多余空行,菱形左边不允许有多余空列
输入样例 3
输出样例
*
* *
*
代码如下(示例):
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int mid = n/2+1;
for(int i = 1;i<=n;i++)
{
//打印上层
if(i<=mid)
{
for(int j = 1;j<=n;j++)
{
if(j == mid - (i-1)||j == mid + (i-1))
{
printf("*");
}
else//其余位置都打成空格
printf(" ");
}
}
//打印下层
else if(i>mid)
{
for(int j = 1;j<=n;j++)
{
if(j == mid - (n - i)||j == mid + (n - i))
{
printf("*");
}
else
printf(" ");
}
}
printf("\n");
}
return 0;
}
总结
我和你没什么好总结的(bushi~)