PTA2023作业练习函数题(1-10)
PTA2023作业练习函数题(1-10)

PTA2023作业练习函数题(1-10)

6-1-01 整数交叉合并

分数 10

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

【难度为1级,难度等级为1-5级】
本题目要求将两个2位整数合并,交叉合并。当a=45,b=12,调用该函数后,c=1425。

函数接口定义:

int swap(int a,int b);

其中 a 和 b 是需要合并的两位数;函数返回交叉合并后的值。

裁判测试程序样例:

#include<stdio.h>

int swap(int a,int b);

int main()
{
    int x,y,z;
    scanf("%d%d",&x,&y);
    z=swap(x,y);
    printf("%d",z);
    return 0;
}

/* 请在这里填写答案 */

小贴士:这是第一个函数题,一是请大家先去了解值传递、形参、返回值这些基本的函数语法,不要上来就做。你自己不懂函数的语法,自己造函数语法,你能解决报错吗?二是注意这里的形参a和b就是你要处理的变量,对a和b进行拆数,组合。三是这里的返回结果不是0,是组合后的新数。三是int swap(int a,int b)函数定义不要末尾加分号成int swap(int a,int b);这不是一条语句结束,这是一个函数的起始定义。四是不要写main函数了,读清楚题目!题目只要你写一个swap函数的功能,因此你的代码只需要长这样:

int swap(int a,int b)

{//写入函数功能的代码

}

不要写#include和main函数,多写算错。

输入样例:

12 34

输出样例:

3142
int swap(a,b)
{
    return (b/10*1000+a/10*100+b%10*10+a%10);
}

6-2-01 水仙花数

分数 10

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

【难度为1级,难度等级为1-5级】
本题要求实现一个函数,判断输入的数是否为水仙花数。

函数接口定义:

int flower(int x);

函数返回值为1表示是水仙花数,0表示不是水仙花数。

裁判测试程序样例:

#include<stdio.h>

int flower(int x);

int main()
{
    int a,k;
    scanf("%d",&a);
    k=flower(a);
    if(k)
        printf("%d yes",a);
    else
        printf("%d no",a);
    }
    return 0;
}

/* 请在这里填写答案 */

输入样例:

153

输出样例:

153 yes
int flower(int x)
{
    int i,s,h;
    s=0;
    h=x;
    while(x!=0)
    {
        i=x%10;
        s=s+(i*i*i);
        x=x/10;
    }
    if(s==h) return 1;
    else return 0;
}

6-3-01 数列求和

分数 10

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

编写函数计算, sn=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/(2n)),sn作为函数值返回。

函数接口定义:

double add(int n);

函数返回sn。

裁判测试程序样例:

#include <stdio.h>

double add(int n);

int main()
{
    int n;
    double sum;
    scanf("%d",&n);
    sum=add(n);
    printf("%.2f",sum);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

1

输出样例:

0.50
double add(int n)
{
    double s=0;
    for(int i=1;i<=n;i++)
    {
        s+=(1.0/(2*i-1)-1.0/(2*i));
    }
    return s;
}

6-4-01 求天数

分数 15

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题要求实现一个函数sumday,可计算输入的日期是这年中的第几天。

函数接口定义:

int sumday(int year,int month,int day);

函数返回第几天。


小贴士:这题有复杂做法,也有简单做法,关键是因为思路不同,算法不同,代码是顺着你的算法走的,代码是算法步骤的翻译,因此复杂的不是代码问题,是你的算法设计问题。

简单的做法:需要借助数组这种存储结构。一年只有365天和366天两种,区别就是平年2月28天,闰年2月是29天。因此把12个月的天数,用数组保存下来,2月存28天。如果判断year那一年是闰年,就把数组对应的2月改为29天,其他月不变。接下来用一个单循环来循环把每个月天数加起来,直到加到month对应的月。

这题的设计思路体现了算法+数据结构的理念。我的算法借助了数组这种存储结构,二者配合得到好的设计才能落地生成好的代码。

裁判测试程序样例:

#include<stdio.h>

int sumday(int year,int month,int day);

int main()
{
    int year,month,day,days;
    scanf("%d/%d/%d",&year,&month,&day);
    days=sumday(year,month,day);
    printf("%d",days);
    return 0;
}


/* 请在这里填写答案 */

输入样例:

2020/2/5

输出样例:

36
int sumday(year,month,day)
{
    int run,x=0;
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    if((year%400==0)||((year%100!=0)&&(year%4==0))) run=1;
    else run=0;
    if(run) days[1]=29;
    for(int i=0;i<month-1;i++) x+=days[i];
    x+=day;
    return x;
    
}

6-5-01 月纳税额计算

分数 15

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题目要求读入每月工资,计算按月需要累计缴纳的税额(税率见下图),此处只需显示应缴纳的税额,无需减去已缴纳部分。结果保留两位小数。 注意:每月有5000元免税额。

1.png
上图为按年累计应纳税所得额

函数接口定义:

double m_tax(double salary,int month);

其中salary和 month 是用户传入的参数,函数返回每月累计应纳税额。

裁判测试程序样例:

#include<stdio.h>

double m_tax(double salary,int month);

int main()
{
    double money,tax;
    int i;
    for(i=1;i<=12;i++)
    {
        scanf("%lf",&money);
        tax=m_tax(money,i);
        printf("the sum of %d months tax is %.2f\n",i,tax);
    }
    return 0;
}
/* 请在这里填写答案 */

输入样例:

1000
2000
10000
5000
8000
500
2000
15000
1000
5000
6000
9000

输出样例:

在这里给出相应的输出。例如:

the sum of 1 months tax is 0.00
the sum of 2 months tax is 0.00
the sum of 3 months tax is 0.00
the sum of 4 months tax is 0.00
the sum of 5 months tax is 30.00
the sum of 6 months tax is 0.00
the sum of 7 months tax is 0.00
the sum of 8 months tax is 105.00
the sum of 9 months tax is 0.00
the sum of 10 months tax is 0.00
the sum of 11 months tax is 15.00
the sum of 12 months tax is 135.00

注意 :3月虽然工资为10000元,但3个月累计免税额为15000元,因此无需纳税。5月时累计免税额为25000元,累计工资收入为26000元,因此应纳税额为1000元,按税率为30元,后面同理所得。

double m_tax(double salary,int month)
{
    double tax,s;
    static double x=0;
    static int j=0;
    x+=salary;
    s=x-5000*month;
    if(s<=0) tax=0;
    else if(s<=36000) tax=s*0.03;
    else if(s<=144000) tax=s*0.1-2520;
    else if(s<=300000) tax=s*0.2-16920;
    else if(s<=420000) tax=s*0.25-31920;
    else if(s<=660000) tax=s*0.3-52920;
    else if(s<=960000) tax=s*0.35-85920;
    else tax=s*0.45-181920;
    return tax;
}

6-6-01 找素数并保存到数组中

分数 15

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题目要求查找n~m之间所有素数,存入一维数组a中。

函数接口定义:

int  fun(int n,int m,int a[]);

其中 a 为存储的素数;函数返回素数的个数。

小贴士:

1.scanf语法”%d%d”没有空格,如果你还以为需要写成”%d %d”说明你没有明白scanf的默认语法。好比你睡觉默认是需要闭上眼睛的,还要先说闭上眼睛,再说睡觉吗?scanf语法”%d”默认的分割符是所有的空白字符(空格,回车和tab都行)默认可以用空格、回车等作为输入分隔符的。

2.注意下标不要越界,数组下标0-N-1。

裁判测试程序样例:

#include <stdio.h>
#define N 1000

int  fun(int n,int m,int a[]);


int main()
{
    int n,m,k,a[N],i;
    scanf("%d%d",&n,&m);
    k=fun(n,m,a);
    for(i=0;i<k;i++)
        printf("%d ",a[i]);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

10 100

输出样例:

11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
int fun(int n,int m,int a[])
{
    int x=0,flag;
    for(int i=n;i<=m;i++)
    {
        flag=0;
        for(int j=1;j<=i;j++)
        {
            if(i%j==0) flag++;
        }
        if(flag==2)
        {
            a[x]=i;
            x++;
        }
    }
    return x;
}

6-7-01 整数数组移位

分数 10

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

整数数组有n个元素,将数组元素循环右移p位。假设元素原来为:1,2,3,4,5,6,p为3,则移动后的数组为:456123。

函数接口定义:

void  move(int a[], int p);

裁判测试程序样例:

#include <stdio.h>
#define N 10

void  move(int a[], int p);


int main()
{
    int i,a[N]={1,2,3,4,5,6,7,8,9,10},k;
    scanf("%d",&k);
    move(a,k);
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

3

输出样例:

8 9 10 1 2 3 4 5 6 7 
void move(int a[],int p)
{
    int i,j,b[N+1];
    if (p>N) p=p%N;
    for(i=0;i<=N-1;i++) b[i]=a[i];
    for(j=1;j<=p;j++)
    {
        for(i=10;i>=1;i--) b[i]=b[i-1];
        b[0]=b[10];
    }
    for(i=0;i<=N-1;i++) a[i]=b[i];
}

6-8-01 统计比均分高的人数及成绩

分数 15

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过函数值返回。

函数接口定义:

int h_avg(int a[],int n,int b[]);

n 的值是a中的元素个数; b 中存储高于均分的成绩,高于均分的人数通过函数返回。

裁判测试程序样例:

#include <stdio.h>
#define N 10

int h_avg(int a[],int n,int b[]);

int main()
{
    int n,i,x[N],k,y[N];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&x[i]);
    k=h_avg(x,n,y);
    for(i=0;i<k;i++)
        printf("%d ",y[i]);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

5
1 2 3 4 5

输出样例:

3 4 5 
int h_avg(int a[],int n,int b[])
{
    int i,x=0,s=0;
    double av;
    for(i=0;i<n;i++) s+=a[i];
    av=(double)s/n;
    for(i=0;i<n;i++)
    {
        if(a[i]>=av)
        {
        b[x]=a[i];
        x++;
        }
    }
    return x;
}

6-9-02 整理奇偶数增强篇

分数 15

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题要求实现一个函数,将数组中的奇数元素排在前半段,偶数排在后半段。

此方法采用从前往后找偶数,再从后往前找奇数的方法,找到后两者交换。

如1,2,3,4,7,6,5经过函数整理后变成1,5,3,7,4,6,2。其中2和5进行了交换,4和7进行了交换。

提示:

image.png

函数接口定义:

void oddeven(int a[],int n);

其中 n 为数据元素个数。

裁判测试程序样例:

#include <stdio.h>
#define N 20

void oddeven(int a[],int n);

int main()
{
    int a[N],i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    oddeven(a,n);
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

7
1 2 3 4 7 6 5

输出样例:

1 5 3 7 4 6 2 
void oddeven(int a[],int n)
{
	int i,j,k;
	for(i=0;i<n/2;i++)
	{
		for(j=n-1;j>=0;j--)
		{
			if((a[i]%2==0)&&(a[j]%2!=0))
			{
				k=a[i];
				a[i]=a[j];
				a[j]=k;
				break;
			}
		}
			
	}
}

6-10-02 简单排序

分数 10

全屏浏览题目

切换布局

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题要求实现一个函数,将数据完成从小到大排序功能。

函数接口定义:

void  sort(int x[],int n);

其中 n 表示排序的元素个数。

裁判测试程序样例:

#include <stdio.h>
#define N 20

void  sort(int x[],int n);

int main()
{
    int a[N],n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,n);
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

5
3 2 1 5 4

输出样例:

1 2 3 4 5 
void  sort(int x[],int n)
{
    int i=0,a,b;
    for(;i<n;i++)
    {
        b=0;
        for (;b<n-1;b++)
        {
            if (x[b]>x[b+1])
                {
                a=x[b];
                x[b]=x[b+1];
                x[b+1]=a;
                }
        }
        b=0;
    }
}

PTA2023作业练习函数题(11-24)

一条评论

  1. Pingback:PTA2023作业练习函数题(11-24) – 热眶

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注