重温一下PTA团体程序设计天梯赛-练习集,有意思的题目分享下自己的思路,也希望能学到更简单的思路
L1~002
思路:
1.用数学思维,可以看出这是个数列题,沙漏所需要的符号数为1+3×2+5×2+7×2+......,这是高中数学中的Sn也就是数列和,而An的式子如下:
An=1,n=1时
An=2×( 2n-1 )=4n-2,n>=1时
所以等差数列Sn=2n²-1,接下来我们要判断输入的数字应该停在“n等于几”,即2n²-1>“输入的数字”时,打印一个这样的沙漏需要2(n-1)²-1个符号,而 “输入的数字”-(2(n-1)²-1)就是要输出在沙漏下面的“多出的符号的数量”。
2.要打印沙漏,很容易看出来这是个二重循环,外循环是行用下标i(因为),内循环是列用下标j,每行打印的符号数为An=2n-1个,只不过每打印一行n就减一。单独打印上面的三角形的代码:
for(j=number=--i;j>0;j--)//上面的三角形
{ //其中i即n,number为i-1,j为变化的n
for(i=number-j;i>0;i--)//打印空格
printf(" ");
for(i=1;i<=2*j-1;i++)//打印符号
printf("%c",ch);
printf("\n");
}
同理,下面的三角形的代码:
for(j=2;j<=number;j++)//下面
{
for(i=number-j;i>0;i--)
printf(" ");
for(i=1;i<=2*j-1;i++)
printf("%c",ch);
printf("\n");
}
完整代码:
#include <stdio.h>
int main()
{
int n,number,i,j;
char ch;
scanf("%d %c",&n,&ch);
for(i=1;;i++)
if(n<2*i*i-1) break;
for(j=number=--i;j>0;j--)//上面
{
for(i=number-j;i>0;i--)
printf(" ");
for(i=1;i<=2*j-1;i++)
printf("%c",ch);
printf("\n");
}
for(j=2;j<=number;j++)//下面
{
for(i=number-j;i>0;i--)
printf(" ");
for(i=1;i<=2*j-1;i++)
printf("%c",ch);
printf("\n");
}
printf("%d",n-2*number*number+1);
return 0;
}
L1~003
思路:
先定义一个全局数组a[11],再把输入的一串数字当成char字符类型,再储存到int的命名为a[11]的数组里面,即:
while(1)
{
ch=getchar();
if(ch==10) break;//ASCII码10是回车
else a[ch-'0']++;//ch-'0'就是数字
} //如8的字符char类型-'0'就是数字8
之后a[n]中a[n]为几,就说明有几个“数字为n的数”,如果a[2]=3,就说明有3
个数字2,最后打印出来即可。
完整代码:
#include <stdio.h>
int a[11];
int main()
{
int i;
char ch;
while(1)
{
ch=getchar();
if(ch==10) break;
else a[ch-'0']++;
}
for(i=0;i<10;i++)
if(a[i]!=0) printf("%d:%d\n",i,a[i]);
return 0;
}