PTA团队赛几个典型题集(循环,递归,结构体,字符串)

PTA团队赛题集
循环
1.求阶乘序列前N项和: pta循环1
习题2-6 求阶乘序列前N项和 (15分)

#include<stdio.h>
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<stdio.h>
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<stdio.h>
#include<math.h>
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 <stdio.h>
#include <math.h>

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<stdio.h>   //核心: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;                //m<n——m不变 ; m==n——无变化 ; m>n——左移|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<stdio.h>  
int main()
{  
    int a[10][10],i,j,n,m;  
    scanf("%d %d",&m,&n);  
    for(i=0;i<n;i++)  
        for(j=0;j<n;j++)  
            scanf("%d",&a[i][j]);  
    m=m%n;  //可能会出现m比n还大所以取余数   
    for(i=0;i<n;i++)
    {  
        for(j=n-m;j<n;j++)   //先输出 右移的部分   
            printf("%d ",a[i][j]);  
        for(j=0;j<n-m;j++)   //输出剩下的部分   
            printf("%d ",a[i][j]);  
        printf("\n");  
    }         
    return 0;   
}
*/

递归

1.递归实现顺序输出整数: pta递归1
习题10-8 递归实现顺序输出整数 (15分)

#include <stdio.h>

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 <stdio.h>

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<stdio.h>
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<stdio.h>//带空格的字符串,只能用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 <stdio.h>
#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<stdio.h>
#include<string.h>
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<stdio.h>
#include<string.h>
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;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值