今天没有学习新的算法,一直在刷acm题库和实验室的题库,以下是今天遇到的重点题目和知识点。
1.打印图形
描述
根据输入的数据打印相应的图形
格式
输入格式
输入一个n(1<=n<=20)(多组输入)
输出格式
输出相应的图形(每行最后一个数后没有空格)
样例输入
1
2
3
4
5
样例输出
0
0
1 2 3
0
1 2 3
4 5 6 7 8
0
1 2 3
4 5 6 7 8
9 0 1 2 3 4 5
0
1 2 3
4 5 6 7 8
9 0 1 2 3 4 5
6 7 8 9 0 1 2 3 4
思路分析: 这道题的主要分成两部输出,先输出空格,再输出数字。首先可以卡出,输出n行数据,然后看每一行的数据的个数,找规律可以发现第一行是一个数,从第二行开始,每一行数据的个数等于前一行的数据个数+2,因此定义一个计数器num,每往下一层,+2即可。并且定义一个count变量,赋0,表示输出的值,如果到10则变成重新从0开始。
然后就是前面的空格怎么输出,通过找规律可以得出,每一行的空格数等于n减去当前的行数。
代码实现:
#include<stdio.h>
int main()
{ int n,i,j;
while(~scanf("%d",&n))
{ int num=1,count=0;//num控制每一行的数据的个数
for(i=1;i<=n;i++)
{ for(j=i;j<=n-1;j++)
printf(" ");
for(j=0;j<num;j++)
{printf("%d ",count++);
if(count==10)count=0;}
printf("\n");
num+=2;
}
}
return 0;
}
2. Spira
Spira 是一种螺旋,从 Spiral 演变过来的。废话不多说,蒜头君决定称如下的等腰直角三角形为 Spira:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
这个是腰长为 55 的时候的样子。那么如果有其它腰长的 Spira 会是怎么样的呢?蒜头君想让你一个个画出来。
输入格式
第一行一个正整数 T(1 \le T \le 10)T(1≤T≤10),代表测试数据组数。
以下 TT 行,各行就一个正整数 N(2 \le N \le 1000)N(2≤N≤1000),代表三角形腰长。
输出格式
对于每个测试数据,输出相应的 Spira。每组数据之间以一个空行来间隔。
样例输入:
2
5
4
样例输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
1 2 3 4
9 10 5
8 6
7
思路分析:这道题的思路就是把输出分成三部分,上部分、斜部分和左部分,并且每次赋值之前要判断要赋值的位置是否有值。
代码实现:
#include<stdio.h>
int a[1010][1010];
int main()
{
int i=0,j=0,n,T,k;
scanf("%d",&T);
while(T--)
{ scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
i=0;j=0;k=1;
a[i][j]=1;
while(1)
{
if(k>=(n*(n+1)/2))break;
while(j<n-1&&a[i][j+1]==0)
a[i][++j]=++k;
while(j>0&&a[i+1][j-1]==0)
a[++i][--j]=++k;
while(i>0&&a[i-1][j]==0)
a[--i][j]=++k;
while(j<n-1&&a[i][j+1]==0)
a[i][++j]=++k;
}
for(i=0;i<n;i++)
{for(j=0;j<n-i;j++)
if(a[i][j]==0)printf(" ");
else printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}
3。精挑细选
小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下:
- 这根钢管一定要是仓库中最长的;
- 这根钢管一定要是最长的钢管中最细的;
- 这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近)。
相关的资料到是有,可是,手工从几百份钢管材料中选出符合要求的那根……要不,还是请你编写个程序来帮他解决这个问题吧。
输入格式
文件第一行为一个整数 n\ (1\le n \le 1000)n (1≤n≤1000),表示仓库中所有钢管的数量。
之后 nn 行,每行三个整数,分别表示一根钢管的长度(以毫米为单位,在 [1,10000][1,10000] 范围内)、直径(以毫米为单位,,在 [1,100][1,100] 范围内)和编码(一个 99 位整数)。
输出格式
只有一个 99 位整数,表示选出的那根钢管的编码。
样例输入:
4
3000 50 872198442
3000 45 752498124
2000 60 765128742
3000 45 652278122
样例输出:
752498124
思路分析: 这道题的思路就是要嵌套If语句,定义结构体变量,注意编号的长度超过了int型,因此需要定义成long long型。
代码实现:
#include<stdio.h>
struct node{int length,slim;long long s;};
int main()
{ struct node num[1010];
int i,j,n,max;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d %lld",&num[i].length,&num[i].slim,&num[i].s);
max=0;
for(i=1;i<n;i++)
if(num[i].length>num[max].length)max=i;//记录长度更长的
else if(num[i].length==num[max].length)//如果长度一样,就比较粗细
{ if(num[i].slim<num[max].slim)max=i;//记录更细的
else if(num[i].slim==num[max].slim)//如果粗细程度也一样的话,记录编号更大的
{ if(num[i].s>num[max].s)max=i;
}
}
printf("%lld",num[max].s);
return 0;
}