PTA 浙大第四版 C语言练习

PTA 浙大版《C语言程序设计实验与习题指导(第4版)》

  • 开始前说的话
PTA是一个很注重格式输出的练习题库
所以严格禁止提交的答案中,有像自己的提示输入一样的额外内容
例如 printf("请输入x:");
严格禁止汉字存在,注释也不行
本文代码全部是按照我的理解编写
测试使用平台为DEV C++,文中代码全部经过测试后才上传
刚刚开始更新 争取11月底前更新完成
代码如有雷同纯属巧合,仅供学习参考

实验2-5-1

题目
在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

double fact( int n );

int main(void)
{    
    int m, n;
    double result; 

    scanf("%d%d", &m, &n);
    if(m > 0 && n > 0 && m <= n){
        result = fact(n)/fact(n-m);
        printf("result = %.0f\n", result);    
    }

    return 0;

解答

思路:求阶乘

double fact( int n ){

	int sum;
	sum=1;
	while(n) {
		sum=sum*n;
		n--;	
	}
	return sum;
}

但是结果不对
在这里插入图片描述

测试了一下,发现sum 只有10位,想到sum是int型,改用flout结果正确

double fact( int n ){

	float sum;
	sum=1;
	while(n) {
		sum=sum*n;
		n--;	
	}
	return sum;
}

实验2-5-5 简单实现x的n次方

题目
在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

double mypow( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%f\n", mypow(x, n));

    return 0;
}

/* 你的代码将被嵌在这里 */

解答

幂次方计算,和上题一样 注意输出变量的类型

double mypow( double x, int n )
{
	double sum;
	sum=1;
		while(n){
		sum=sum*x;
		n--;
	}
	return sum;
}

实验4-2-2 使用函数求e的近似值

在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

double fact( int n );

int main(void)
{    
    int i, n;
    double sum; 

    scanf("%d", &n);
    sum = 1;
    for(i = 1; i <= n; i++){
        sum = sum + 1.0/fact(i); 
     }
     printf("%f\n", sum);

    return 0;
}

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

解答

同第一题

double fact( int n ){

	float sum;
	sum=1;
	while(n) {
		sum=sum*n;
		n--;	
	}
	return sum;
}

实验5-1 使用函数计算两点间的距离

在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>
#include <math.h>

double dist( double x1, double y1, double x2, double y2 );

int main()
{    
    double x1, y1, x2, y2;

    scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
    printf("dist = %.2f\n", dist(x1, y1, x2, y2));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

解答

核心思路:
1 分别求两点坐标横坐标和纵坐标的差值x和y
2 两点之间的距离=根号下x^2 +y^2

double dist( double x1, double y1, double x2, double y2 ){
	double sum,x,y;
	x=x2-x1;
	y=y2-y1;
	sum=sqrt(x*x+y*y);
	return sum;	
}

实验5-2 符号函数

在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

int sign( int x );

int main()
{
    int x;

    scanf("%d", &x);
    printf("sign(%d) = %d\n", x, sign(x));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

解答

注意if的()里是==,单个=是赋值语句

int sign( int x ){
	if(x==0){
		return 0;
	} 
	else if(x<0){
		return -1;
	}
	else {
		return 1;
	}
} 

实验5-3 使用函数求Fibonacci数

在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

int fib( int n );

int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", fib(n));

    return 0;
}

/* 你的代码将被嵌在这里 */

解答

先解释一下Fabonacci数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,
因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,
故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
在数学上,斐波那契数列以如下被以递推的方法定义:
F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

核心就是

F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)

所以要分类讨论
并且,第n位的数字是经过n-1次相加得到的,即循环n-1次
(可以根据n个数字中间有n-1个空隙想象一下)

int fib( int n ){
	int a,b,sum;
	a=0;
	b=1;
	sum=0;
	if(n==0){
		return 0;
	}
	else if(n==1){
		return 1;
	}
	else{
		while(n-1){
			sum=a+b;
			a=b;
	 		b=sum;
			n--;
		}
		return sum;
	}

}

实验5-4 输出每个月的天数

在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

int MonthDays(int year, int month);

int main()
{
    int ndays, month, year;

    scanf("%d", &year);
    for(month = 1; month <= 12; month++){
        ndays = MonthDays(year, month);
        printf("%d ", ndays);
    }

    return 0;
}

/* 你的代码将被嵌在这里 */

解答

核心思路:
一、 判断闰年两个条件
1.能被 4 整除但不能被 100 整除
2.能被 400 整除

int MonthDays(int year, int month){

	int rm[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
	int pm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if((year%4==0&&year%100!=0)||(year%400==0)){
		return rm[month];
	}
	else{
		return pm[month];
	}
}

二、取月份
利用数组下标,本题也能这样做

int MonthDays(int year, int month){

	int rm[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	int pm[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	if((year%4==0&&year%100!=0)||(year%400==0)){
		return rm[month-1];
	}
	else{
		return pm[month-1];
	}
}

实验5-5 使用函数求最大公约数

在这里插入图片描述
裁判测试程序样例:

#include <stdio.h>

int gcd( int x, int y );

int main()
{
    int x, y;
    
    scanf("%d %d", &x, &y);
    printf("%d\n", gcd(x, y));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

解答

辗转相除法

辗转相除法
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
例如,求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29

核心思路:
保证x>y,左边除右边直到除尽,除尽的那个数就是最大公约数

int gcd( int x, int y ){
	int yu;

	while(x%y!=0){
		if(y>x){
			yu=x;
			x=y;
			y=yu;
			}
		yu=x-y;
		x=y;
		y=yu;	
	}
	return y;
}

实验5-6 使用函数求素数和

在这里插入图片描述
裁判测试程序样例:

#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;
}

/* 你的代码将被嵌在这里 */

解答

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值