赞
踩
重温一下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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。