PTA练习题错题归纳

厘米换算英尺英寸

分数 15
作者 翁恺
单位 浙江大学
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:
输入在一行中给出1个正整数,单位是厘米。

输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。英寸的值应小于12。

输入样例:
170
输出样例:
5 6
答案:

tips:[另附C语言取整方法

](https://blog.csdn.net/qq_43448856/article/details/112939667)

#include<stdlib.h> 
#include<stdio.h> 
#include<math.h>
// 法一:
int main(){
	int cm,foot,inch;
	scanf("%d",&cm);
    foot=(int)(cm/30.48);
    inch=(int)((cm/30.48-foot)*12);
	printf("%d %d",foot,inch);
}
// 法二
/*
include <stdio.h>
int main(){
int cmlen;
 scanf("%d",&cmlen);
 int foot= cmlen/100.0/0.3048;
 int inch = (cmlen/100.0/0.3048-foot)*12;
 printf("%d %d\n",foot,inch);
}*/

实验2-2-7 整数152的各位数字

本题要求编写程序,输出整数152的个位数字、十位数字和百位数字的值。

输入格式:
本题无输入。

输出格式:
按照以下格式输出:

152 = 个位数字 + 十位数字10 + 百位数字100
思路:做本题时用到求整数的各个位,求个位数为n%10,求十位数为n/10%10,求百位数为n/100%10,以此类推.

int main(){
	
	int n=152; 
	int str[3];
/*法一
for(int i=0,j=1;j<=100&&i<3;j*=10,i++)
{
	str[i]=n/j%10;
		}
		*/
		//法二
	int i=0,j=1;		
	 while(j<=100 && i<3){
	 	str[i]=n/j%10;
	 	i++;
	 	j*=10;
	 }
	
	printf("152 = %d + %d*10 + %d*100",str[0],str[1],str[2]);
}

实验2-3-3 计算存款利息

分数 10
作者 颜晖
单位 浙大城市学院
本题目要求计算存款利息,计算公式为interest=money×(1+rate)
year
−money,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。

输入格式:
输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。

输出格式:
在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。

输入样例:
1000 3 0.025
输出样例:
interest = 76.89

思考:在解题过程中,我把year当成整数,从而导致当year不为整数时计算错误,为了计算year不为整数的情况,要用到求次方函数pow。原型为:double pow(double x, double y); 求x^y;使用时注意参数类型,如果x,y为整数可能运行会出错。使用时要加上**#include<math.h>**
另附:double sqrt(double x); 计算x平方根。函数参数和返回值都是double类型,使用时x为整形也可以,不过有可能答案会出错。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
	float money,year,rate,interest;
	scanf("%f %f %f",&money,&year,&rate);
	float temp=1;
/*	for(int i=1;i<=year;i++){
		temp*=(1+rate);
	}*/
	temp=pow(1+rate,year);
	interest=money*temp-money;
	printf("interest = %.2f",interest); 
}

实验2-3-5 整数算术运算

分数 10
作者 颜晖
单位 浙大城市学院
本题要求编写程序,计算并输出2个正整数的和、差、积、商与余数。题目保证输入和输出全部在整型范围内。

输入格式:
输入在一行中给出2个正整数A和B。

输出格式:
在5行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商与余数。

输入样例:
5 3
输出样例:
在这里给出相应的输出。例如:

5 + 3 = 8
5 - 3 = 2
5 * 3 = 15
5 / 3 = 1
5 % 3 = 2
思考:题目不难,但是要注意特殊字符的输出

printf("%%d");//在屏幕中输出%d
printf("\\n");//在屏幕中输出\n
printf("%%");//在屏幕中输出%
printf("\\t");//在屏幕中输出\t

实验2-3-7 阶梯电价

分数 15
作者 陈建海
单位 浙江大学
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

输入格式:
输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:
在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。

输入样例1:
10
输出样例1:
cost = 5.30
思考:题目简单,但是我犯了一个小错误,电价在0-50时条件写错了

#include<stdio.h>
int main(){
	int k;
	scanf("%d",&k);
	float m;
	if(k<0){
		printf("Invalid Value!");
	}else if(k>=0 && k<=50){//正确写法k>=0 && k<=50;错误写法0<=k<=50
			m=0.53*k;
			printf("cost = %.2f",m);
	}else{
			m=50*0.53+(k-50)*0.58;
			printf("cost = %.2f",m);
	}
	
	
}

实验2-3-8 计算火车运行时间

分数 15
作者 沈睿
单位 浙江大学
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。

输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。

输入样例:
1201 1530
输出样例:
03:29
思考:把时间全部转换为分钟,计算出结果后,再转成hh:mm形式,主要是控制输出格式不懂
如何控制输出的格式%m.nf
%02d 右对齐输出,位数不够补0;
%2d右对齐输出,位数不够补空格;
%.2f输出两位小数,左对齐输出,位数不够自动补0;

(这里不含有四舍五入,只有保留位数,想要四舍五入也很简单,先乘以10^(n-1)然后加0.5强制转化就行了)

#include<stdlib.h>
#include<stdio.h>

int main(){
	int g,r;
	scanf("%d %d",&g,&r);
/*	int hh=r/100-g/100;
	int mm;
	if((r%100-g%100)<0){
		hh--;
		mm=60+r%100-g%100;
	}*/
	int gt=g/100*60+g%100;
	int rt=r/100*60+r%100;
	int t=rt-gt;
	int hh,mm;
	hh=t/60;
	mm=t%60;
printf("%02d:%02d",hh,mm);
}

实验2-4-2 求N分之一序列前N项和

分数 15
作者 C课程组
单位 浙江大学
本题要求编写程序,计算序列 1 + 1/2 + 1/3 + … 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:
6
输出样例:
sum = 2.450000
题目不难,但要注意输入输出格式:
double,双精度浮点型,对应%lf。
定义一个double的变量可以写作:double a;
输入语句可以写作:scanf(“%lf”, &a);输出语句可以写作:printf(“%lf”,a);
在输入输出时,一定要区分好double和float,而使用对应的格式符号。
%f是以float类型格式化输入或输出

实验2-4-3 求奇数分之一序列前N项和

分数 15
作者 C课程组
单位 浙江大学
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。
思考:读题时把题目看错了,注意是前n项!

#include<stdlib.h>
#include<stdio.h>

int main(){
	int n;
	scanf("%d",&n);
	double sum=0.0;
	for(int i=0;i<n;i++){
		sum+=(1.0/(2*i+1));
		
	}
	printf("sum = %lf",sum);
}

实验2-5-4 求组合数

在这里插入图片描述
输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。
输入样例:
2 7
输出样例:
result = 21
思考:题目不难,主要问题是精度问题,要认真看题目要求,说是double就要用double的变量!!

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


double fact(int n)
{
    if(n==0){
		return 1.0;
	}else{
		double s=1.0;
		for(int i=1;i<=n;i++){
		s*=i;
        }
		return s;
	}
}
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	double re=0;
	re=fact(n)/(fact(m)*fact(n-m));
	
	printf("result = %.0f",re);
}

实验4-1-1 统计数字字符和空格

本题要求编写程序,输入一行字符,统计其中数字字符、空格和其他字符的个数。建议使用switch语句编写。

输入格式:
输入在一行中给出若干字符,最后一个回车表示输入结束,不算在内。

输出格式:
在一行内按照

blank = 空格个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。请注意,等号的左右各有一个空格,逗号后有一个空格。

输入样例:
在这里给出一组输入。例如:

Reold 12 or 45T
输出样例:
blank = 3, digit = 4, other = 8
在这里给出相应的输出。例如:
思考:题目不难,但要注意switch的用法,
1)括号内的"表达式",其值的类型应为整数类型(包括字符型)。
(2)花括号内是一个复合语句,内包含多个以关键字case开头的语句行和最多一个以 default开头的行。case后面跟一个常量(或常量表达式),它们和 default都是起标号作用,用来标志一个位置。执行switch语句时,先计算 switch后面的"表达式"的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与 switch表达式相匹配的case常量,流程转去执行 default标号后面的语句。
(3)可以没有 default标号,此时如果没有与 switch表达式相匹配的case常量,则不执行任何语句。
(4)各个case标号出现次序不影响执行结果。
(5)每一个case常量必须互不相同;否则就会出现互相矛盾的现象。
(6)case标号只起标记的作用。**在执行 switch语句时,根据 switch表达式的值找到匹配的入口标号,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。**因此,**一般情况下,在执行一个case子句后,应当用 break语句使流程跳出 switchs结构。**最后一个case子句(今为 default子句)中可不加 break语句。
(7)在case子句中虽然包含了ー个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。
(8)多个case标号可以共用一组执行语句

#include<stdlib.h>
#include<stdio.h>

int main(){
	char s[1000];
	int len,b=0,d=0,oth=0;
	for(int i=0;i<1000;i++){
		scanf("%c",&s[i]);
		if(s[i]=='\n'){
			len=i;
			break;
		}
	}
	for(int i=0;i<len;i++){
		switch(s[i]){
			case ' ':b++;break;
			case '1':d++;break;
			case '2':d++;break;
			case '3':d++;break;
			case '4':d++;break;
			case '5':d++;break;
			case '6':d++;break;
			case '7':d++;break;
			case '8':d++;break;
			case '9':d++;break;
			case '0':d++;break;
			default:oth++;break;
		}
	}
	printf("blank = %d, digit = %d, other = %d",b,d,oth);
	
}

4-1-6 求分数序列前N项和

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:
20
输出样例:
32.66
思考:要把下一项的分子分母提前存起来,以便后面赋值,如果不这样的话,后面赋值容易错把新值代入到计算中。

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

int main(){
	int n;
	scanf("%d",&n);
	double sum=0.00;
	if(n==1){
		sum=2;
	}else{
		sum+=2;
		double fz=2.0,fm=1.0;
		for(int i=2;i<=n;i++){
			double z=fz+fm,m=fz;//主要要用double,不然当n较大是会出错
			sum+=(fz+fm)/fz;
			fz=z;
			fm=m;
		}
	}
	printf("%.2lf",sum);
}

实验4-1-7 特殊a串数列求和

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:
输入在一行中给出不超过9的正整数a和n。

输出格式:
在一行中按照“s = 对应的和”的格式输出。

输入样例:
2 3
输出样例:
s = 246
思考:注意要把a的值保留下来,如果不保留的话,后面更新aaa时会把aa的值加进去;

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

main(){
	int a,n;
	scanf("%d %d",&a,&n);
	
	int sum=0,b=a;
	for(int i=1;i<=n;i++){
		sum+=b;
		b=(b*10+a); 
	}
	printf("s = %d",sum);
}

tips:生成随机数

生成随机数之前先进行播种:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int a;
    srand((unsigned)time(NULL));
    a = rand();
    printf("%d\n", a);
    return 0;
}

生成一定范围内的随机数

int a = rand() % 51 + 13;    //产生13~63的随机数

tips:sort()函数使用方法

#include<algorithm>
using namespace std;
//sort(数组名,数组名+元素个数,排序函数);
int a[5]={5,3,7,2,8};
	sort(a,a+5);//对数组a进行排序 
	for(int i=0;i<5;i++){
		printf("%d ",a[i]);

实验4-1-12 黑洞数
分数 20
作者 C课程组
单位 浙江大学
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

例如,对三位数207:

第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程。

输入格式:
输入在一行中给出一个三位数。

输出格式:
按照以下格式输出重排求差的过程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。

输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
思考:解法不难,主要是排序不能直接用sort函数

#include<stdlib.h>
#include<stdio.h>
//#include<algorithm>
//using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	int a[3];//分别存储个位,十位,百位 
	int min=-1,max=-1;
	int count=1;//计数用 
	
	while((max-min)!=495){
		int temp=1;
		for(int i=0;i<3;i++){
		a[i]=n/temp%10;
		temp*=10;
		}
		//排序
		for(int i=0;i<3-1;i++){
			for(int j=0;j<3-1-i;j++){
				int t;
				if(a[j]>a[j+1]){
					t=a[j];
					a[j]=a[j+1];
					a[j+1]=t;
				}
			} 
		}
		//sort(a,a+3);
		min=a[0]*100+a[1]*10+a[2];
		max=a[2]*100+a[1]*10+a[0];
		printf("%d: %d - %d = %d\n",count,max,min,max-min);
		
		n=max-min;
		count++;
	}
	
}

实验4-2-1 求e的近似值

分数 15
作者 C课程组
单位 浙江大学
自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:
输入第一行中给出非负整数 n(≤1000)。

输出格式:
在一行中输出部分和的值,保留小数点后八位。

输入样例:
10
输出样例:
2.71828180
思考;题目不难,主要是注意隐含条件,比如当n取1000时,1000的阶乘就超过整型的范围了,因此求阶乘函数返回时要返回double型,这样范围够大运行才不会出错。

#include<stdlib.h>
#include<stdio.h>

double jie(int n){
	double re=1;
	if(n==0 || n==1){
		return 1;
	}else{
		for(int i=1;i<=n;i++){
			re*=i;
		}
		return re;
	}
}

int main(){
	int n;
	scanf("%d",&n);
	double s=1.0;
	if(0<=n && n<=1000){
		for(int i=1;i<=n;i++){
		s+=(1.0/jie(i));
	}
	}
	
	printf("%.8lf",s);
	
}

实验4-2-7 找完数

分数 20
作者 陈建海
单位 浙江大学
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
思考:题目不难,主要是要找因数

#include <stdio.h>
int main()
{
    int number, i;
    printf("输入一个整数: ");
    scanf("%d",&number);
    printf("%d 的因数有: ", number);
    //求因数
    for(i=1; i <= number; ++i)
    {
        if (number%i == 0)
        {
            printf("%d ",i);
        }
    }
    return 0;
}

题解:

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


int main(){
	int m,n,sum,index,judge=0;
	scanf("%d %d",&m,&n);
	int a[100];
	for(int i=m;i<=n;i++){
		//求因数
		 sum=0,index=0;
		for(int j=1;j<i;j++){
			if(i%j==0){
				sum+=j;
				a[index]=j;
				index++;
			}
		} 
		if(sum==i && sum!=0){
			judge=1;
			printf("%d = 1",i);
			for(int k=1;k<index;k++){
			printf(" + %d",a[k]);
		} 
			printf("\n");
		}
	}
	if(judge==0){
			printf("None");
		}
} 

实验4-2-9 水仙花数

分数 20
作者 徐镜春
单位 浙江大学
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1
3
+5
3
+3
3
。 本题要求编写程序,计算所有N位水仙花数。

输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:
3
输出样例:
153
370
371
407
思考:题目不难,问题在于用pow函数会超时,所以自己重新写了一个求次幂的函数。

#include<stdlib.h>
#include<stdio.h>
//#include<math.h>
int pow1(int n,int index){
	int t=n;
	for(int i=2;i<=index;i++){
		t*=n;
	}
	return t;
}

int shui(int n,int len){
	int a[7];
	int j=1,sum=0;
	for(int i=0;i<len;i++){
		a[i]=n/j%10;
		j*=10;
		sum+=pow1(a[i],len);
	}
	if(sum==n){
		return 1;
	}else return 0;
	
}


int main(){
	int n;
	scanf("%d",&n);
	int min=pow1(10,n-1),max=pow1(10,n);
	
	for(int i=min;i<max;i++){
		if(shui(i,n)){
			printf("%d\n",i);
		}
	}
} 

实验6-2 英文字母替换加密(大小写转换+后移1位)
分数 15
作者 颜晖
单位 浙大城市学院
本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。

输入格式:
输入一行字符,以回车符 '\n’作为 结束符。

输出格式:
将输入的一行字符中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母后输出,其他字符按原样输出。

输入样例:
在这里给出一组输入。例如:

Reold Z123?
输出样例:
在这里给出相应的输出。例如:

sFPME a123?
思考:字符串的输入掌握熟悉,同时要把计算后的数据放在另一个数组里面,如果放在原来的数组里面会导致错误,如字母’C’在if循环时变换成‘d’,在经过else if循环时,发现满足循环,又会把‘d’变成E,就导致了错误。

tips:字符串输入知识点

https://blog.csdn.net/weixin_46768191/article/details/125984553

tips:格式化输出知识

https://blog.csdn.net/qq_15719613/article/details/120498522

tips:常用字符串函数

常见字符串函数

#include<stdlib.h>
#include<stdio.h>


int main(){
	char a[100],b[100];
//	getchar();
	int len=0;
	for(int i=0;i<100;i++){
		scanf("%c",&a[i]);
		if(a[i]=='\n'){
			len=i;
			break;
		}
	}
	
	
	for(int i=0;i<100;i++){
		
		if('A'<=a[i] && a[i]<='Z'){
			if(a[i]=='Z'){
				b[i]=('A'+32);
			}else{
				b[i]=(a[i]+1+32);
			}
		}else if('a'<=a[i] && a[i]<='z'){
			if(a[i]=='z'){
				b[i]=('a'-32);
			}else{
				b[i]=(a[i]+1-32);
			}
		}else{
			b[i]=a[i];
		}
	}
	
	for(int i=0;i<len;i++){
//		if(b[i]=='\n')break;
		printf("%c",b[i]);
	}
} 

tips:C语言字符类型和数字类型互相转换

https://blog.csdn.net/weixin_33341108/article/details/117014287

实验4-1-10 兔子繁衍问题

分数 15
作者 徐镜春
单位 浙江大学
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:
输入在一行中给出一个不超过10000的正整数N。

输出格式:
在一行中输出兔子总数达到N最少需要的月数。

输入样例:
30
输出样例:
9
思考:开始没看出是斐波那契数列, 先按时间计算一下123456月的兔子对数分别为 1 1 2 3 5 8 对;问题可转化为求第几项的斐波那契数字大于等于n

#include<stdlib.h>
#include<stdio.h>
int fibo(int n){
	if(n==1 || n==2)return 1;
	else return fibo(n-2)+fibo(n-1);
}

int main(){
	int n;
	scanf("%d",&n);
	int now=1;//月份,起始为1
	while(fibo(now)<n){
		now++;
	}
	printf("%d",now);
} 

实验11-2-1 建立学生信息链表

分数 20
作者 张泳
单位 浙大城市学院
本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。

函数接口定义:
void input();
该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

struct stud_node {
int num; /学号/
char name[20]; /姓名/
int score; /成绩/
struct stud_node *next; /指向下个结点的指针/
};
单向链表的头尾指针保存在全局变量head和tail中。

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *head, *tail;

void input();

int main()
{
struct stud_node *p;

head = tail = NULL;
input();
for ( p = head; p != NULL; p = p->next )
    printf("%d %s %d\n", p->num, p->name, p->score);

return 0;

}

/* 你的代码将被嵌在这里 */
输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
输出样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
思考:思路不难,就是写代码的时候会遇到各种各样的问题,首先定义struct类型的指针后要记得赋初值,不然直接使用head->next是不起作用啊!其次,输入输出的顺序要搞清楚啊,什么时候该判断输入要清楚,我就是把3个输入直接放一起了出错,一个把学号单独拿出来判断

tips:program received signal sigsegv,Segmentation fault报错

program received signal sigsegv,Segmentation fault的解释

#include <stdlib.h>
#include <string.h>

struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next;
};
struct stud_node *head, *tail;

void input();

int main()
{
    struct stud_node *p;
    
    head = tail = NULL;
    input();
    for ( p = head; p != NULL; p = p->next )
        printf("%d %s %d\n", p->num, p->name, p->score);

    return 0;
}

/* 你的代码将被嵌在这里 */
void input() {
	int n = 0, s = 0;
	char name1[20];
	int count = 0;
	struct stud_node* pre;
	while (1) {
		scanf("%d", &n);

		if (n == 0) {
			tail = pre;
			break;
		}
		else {
			scanf("%s %d", name1, &s);
			struct stud_node* now = (struct stud_node*)malloc(sizeof(struct stud_node));//头节点 

			if (count == 0) {
				head = now;
				now->num = n;
				strcpy(now->name, name1);
				now->score = s;
				now->next = NULL;
				count = 1;
				//				printf("data:%d %s %d\n", now->num, now->name, now->score);
				pre = now;
			}
			else {
				pre->next = now;
				now->num = n;
				strcpy(now->name, name1);
				now->score = s;
				now->next = NULL;
				//			printf("data:%d %s %d\n", now->num, now->name, now->score);
				pre = now;
			}

		}
	}

}
}

实验11-2-9 链表逆置

分数 20
作者 张泳
单位 浙大城市学院
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下:

struct ListNode {
    int data;
    struct ListNode *next;
};
//函数接口定义:
struct ListNode *reverse( struct ListNode *head );
//其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode  *head;

    head = createlist();
    head = reverse(head);
    printlist(head);
    
    return 0;
}

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

思路:开始用原地逆置的方法,发现运行超时了,那就以空间换时间吧,直接新建一个带头结点的链表,把原来链表中的数据一个个取下来,再通过头插法插入新建的链表中。

struct ListNode *reverse( struct ListNode *head ){
	if(head==NULL) return NULL;
	else if(head->next==NULL) return head;
	else{
		//新建一个链表来存放 
		struct ListNode *head1=(struct ListNode *)malloc(sizeof(struct ListNode *));
		head1->next=NULL;
	while(head!=NULL){
		struct ListNode *node=(struct ListNode *)malloc(sizeof(struct ListNode *));
		 
		 node->data=head->data;
		 node->next=head1->next;
         head1->next=node;
		 head=head->next;
	}
	return head1->next;
	
	}

}

实验4-1-11 高空坠球

分数 20
作者 C课程组
单位 浙江大学
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:
33 5
输出样例:
94.9 1.0

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

main(){
	long int n;
	float h;
	scanf("%f %ld",&h,&n);
	double sum=0.0;
	double t;
	if(n==1){
		sum=h;
		h=h/2.0;
	}else if(n==0){
        sum=0;
        h=0;
    }
    else{
		sum+=h;
		h=h*1.0/2;
		for(int i=2;i<=n;i++){
			sum+=(h*2);
			h=h*1.0/2;
		
	}

	}
	
	printf("%.1lf %.1lf",sum,h);
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值