PTA团队赛题集
循环
1.求阶乘序列前N项和: pta循环1
习题2-6 求阶乘序列前N项和 (15分)
#include
double jiecheng(int n);
int main()
{
int n;
int i,sum;
scanf("%d",&n);
sum = 0;
for(i=1;i<=n;i++)
{
sum += jiecheng(i);
}
printf("%d",sum);
return 0;
}
double jiecheng(int n) //难点:定义阶乘的函数
{
int s,i;
s = 1;
for(i=1;i<=n;i++)
{
s *= i;
}
return s;
}
2.求组合数: pta循环2
练习2-18 求组合数 (15分)
#include
double fact(int n);
int main()
{
int m,n;
double c;
scanf("%d %d",&m,&n);
c = fact(n)/fact(m)/fact(n-m); //调用函数,阶乘
printf("result = %.0lf",c);
return 0;
}
double fact(int n) //阶乘的算法
{
int i;
double s=1; //初始化s,便于计算
for(i=1;i<=n;i++)
s *= i; //正常思维
return s;
}
3.高空坠球: pta循环3
习题4-8 高空坠球 (20分)
#include
#include
int main()
{
long h,n;
scanf("%ld %ld",&h,&n);
double sum=h,th;
int i;
if(n==0)
{
sum = 0;
th =0;
}
for(i=2;i<=n;i++)
{
sum =sum + 2.0*h/pow(2,i-1);
th = 1.0*h/pow(2,i);
}
printf("%.1lf %.1lf",sum,th);
return 0;
}
4.统计素数并求和(请优化你的代码): pta循环4
练习4-11 统计素数并求和 (20分)
#include
#include
int prime( int p );
int PrimeSum( int m, int n );
int main()
{
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
int prime( int p )
{
int i;
int temp = 1;
if(p<=0||p==1)
return 0;
if(p == 2)
return 1;
for(i=2;i<p;i++)
{
if(p%i == 0)
{
temp = 0;
break;}
}
return temp;
}
int PrimeSum( int m,int n )
{
int i,sum = 0;
for(i=m;i<=n;i++)
{
if(prime(i) != 0)
sum += i;
}
return sum;
}
5.方阵循环右移: pta循环5
练习7-8 方阵循环右移 (20分)
#include //核心:m %= n ; (n-m+u)%n
/*
1.将给定n×n方阵中的每个元素循环向右移m个位置: 同行中循环移动
即将第0、1、⋯、n−1列变换为第n-m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
2.为0时,代表返回第一列,然后重头开始*/
int main()
{
int m,n;
scanf("%d %d\n",&m,&n);
int i,u;
int a[i][u];
for(i=0;i<n;i++)
{
for(u=0;u<n;u++)
{
scanf("%d",&a[i][u]);
}
scanf("\n");
}
m = m%n; //mn——左移|n-m|,经过计算后的m,n-m是满足的
//这一步太绝了,想不出来,只能理解这种思路
for(i=0;i<n;i++)
{
for(u=0;u<n;u++)
{
printf("%d",a[i][(n-m+u)%n]);//又是神仙操作a[i][(n-m+u)%n]
} //n-m+u依据题目信息得到
//%n是超过n列时继续移动的次数
//(因为限制在同一行中)
printf("\n");
}
return 0;
}
/*容易理解点
#include
int main()
{
int a[10][10],i,j,n,m;
scanf("%d %d",&m,&n);
for(i=0;i
递归
1.递归实现顺序输出整数: pta递归1
习题10-8 递归实现顺序输出整数 (15分)
#include
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
void printdigits( int n )
{
if(n/10>=1)
{
printdigits(n/10);
printf("%d\n",n%10);
}
else
printf("%d\n",n);
}
2.递归计算Ackermenn函数: pta递归2
习题10-5 递归计算Ackermenn函数 (15分)
#include
int Ack( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));
return 0;
}
int Ack(int m, int n)
{
if (m == 0)
return n + 1;
else
{
if (m > 0 && n > 0)
Ack(m - 1, Ack(m, n - 1));
if (n == 0 && m > 0)
Ack(m - 1, 1);
}
}
结构体
1.通讯录排序: pta结构体1
习题9-5 通讯录排序 (20分)
#include
struct information
{
char name[10];
long birth;
char phone[17];
}basic[10],tool;
int main()
{
int n;
scanf("%d\n",&n);
int i,u;
for(i=0;i<n;i++)
{
scanf("%s %ld %s",&basic[i].name,&basic[i].birth,&basic[i].phone);
if(i!=n-1)
scanf("\n");
}
for(i=0;i<n;i++) //冒泡排序
{
for(u=0;u<n-1;u++)
{
if(basic[u].birth>basic[u+1].birth)
{
tool = basic[u+1];
basic[u+1] = basic[u];
basic[u]=tool;
}
}
}
for(i=0;i<n;i++)
printf("%s %ld %s\n",basic[i].name,basic[i].birth,basic[i].phone);
return 0;
}
2.查找书籍:pta结构体2
习题9-4 查找书籍 (20分)
#include //带空格的字符串,只能用gets输入
struct Book
{
char name[32];//长度限制
double price;
}book[12];
int main()
{
int i,n;
scanf("%d\n",&n);
int max = 0,min = 0;
for(i=0;i<n;i++)
{
scanf("\n");
gets(book[i].name);
scanf("%lf",&book[i].price);
if(book[i].price>book[max].price)
max = i;
if(book[i].price<book[min].price)
min = i;
}
printf("%.2lf, %s\n",book[max].price,book[max].name);
printf("%.2lf, %s\n",book[min].price,book[min].name);
return 0;
}
字符串
1.查找子串: pta字符串1
习题11-6 查找子串 (20分)
#include
#define MAXS 30
char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */
int main()
{
char s[MAXS], t[MAXS], *pos;
ReadString(s);
ReadString(t);
pos = search(s, t);
if ( pos != NULL )
printf("%d\n", pos - s);
else
printf("-1\n");
return 0;
}
/* 你的代码将被嵌在这里 */
char *search(char*s,char*t)
{
char *a = NULL;
char *b = t;
while(*s!='\0')
{
if(*s == *t)
{
a = s;
while(*t!='\0')
{
if(*s == *t)
{
s++;
t++;
}
else
{
s = a;
s++;
t = b;
return search(s, t);
}
}
if(*t == '\0')
break;
}
else
s++;
}
if(*t!='\0'&&*s == '\0')
return NULL;
else
{
s=a;
return s;
}
}
2.统计字符出现次数: pta字符串2
实验7-3-8 统计字符出现次数 (20分)
#include
#include
int main()
{
char a[81],b; //用字符数组解决(也可以用字符指针解决)
gets(a); //不会在缓冲区留下'回车'
b = getchar(); //如果不是用gets(),会在缓冲区中留下'回车',从而输入不进'b'
int i,count = 0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]==b)
count++;
}
printf("%d",count);
return 0;
}
3.字符串逆序: pta字符串3
实验7-3-1 字符串逆序 (15分)
#include
#include
int main()
{
char a[82];
gets(a);
int len;
len = strlen(a);
int i;
for(i=len-1; i>=0; i--)
printf("%c",a[i]);
return 0;
}