LHL'PTA 实验2. 前8章实验综合训练(2)

实验2. 前8章实验综合训练(2)

6-1 函数重载实现两数相加 (10分)
设计一个重载函数add,该函数有两个参数,可以实现两个类型相同的参数相加的操作,函数返回相加的结果。两个参数可以是整数、实数和字符串,但必须保证两个参数类型相同。

裁判测试程序样例:
#include
#include
#include
using namespace std;

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

int main()
{
int a, b;
double c, d;
string s1, s2;

cin >> a >> b;
cin >> c >> d;
cin >> s1 >> s2;

cout << add(a, b) << endl;
cout << fixed << setprecision(2) << add(c, d) << endl;
cout << add(s1, s2) << endl;

return 0;

}

输入样例:
3 5
3.3333 5.555555
hello world

输出样例:
8
8.89
helloworld

int add(int a,int b)
{
	return a+b;
}
double add(double a,double b)
{
	return a+b;
}
string add(string a,string b)
{
	return a+b;
}

6-2 引用作函数形参交换两个整数 (10分)
设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。

裁判测试程序样例:
#include
using namespace std;

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

int main()
{
int a, b;

cin >> a >> b;

Swap(a, b);

cout << a << " " << b << endl;

return 0;

}

输入样例:
3 5

输出样例:
5 3

void Swap(int & a, int &b)
{
     int t;
     t=a;
     a=b;
     b=t;
}

6-3 面积计算器(函数重载) (10分)
实现一个面积计算器,它能够计算矩形或长方体的面积。

函数接口定义:
int area(int x, int y);
int area(int x, int y, int z);

第一个函数计算长方形的面积,其中x和y是长和宽。第二个函数计算长方体的表面积,x,y和z是长,宽和高。

裁判测试程序样例:
#include
#include
using namespace std;
int area(int,int);
int area(int,int,int);
int main()
{
int i, repeat, c, x, y, z;
cin>>repeat;
for(i=0;i<repeat;i++){
cin>>c;
if(c2){
cin>>x>>y;
cout<<area(x,y)<<endl;
}
if(c
3){
cin>>x>>y>>z;
cout<<area(x,y,z)<<endl;
}
}
return 0;
}

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

输入样例:
2
2 1 2
3 2 3 4

输出样例:
2
52

int area(int x, int y)
{
	return x*y;
}
int area(int x, int y, int z)
{
	return 2*((x*y)+(x*z)+(y*z));
}

6-4 带默认形参值的函数 (10分)
设计一个带默认形参值的函数add,该函数有三个参数,可以实现三个整数类型的参数相加的操作,函数返回相加的结果。默认形参值从右至左分别是30、20。

裁判测试程序样例:
#include
using namespace std;

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

int main()
{
int a, b, c;

cin >> a >> b >> c;

cout << add(a) << endl;
cout << add(a, b) << endl;
cout << add(a, b, c) << endl;

return 0;

}

输入样例:
1 2 3

输出样例:
51
33
6

int add(int a,int b,int c)
{
	return a+b+c;
}

int add (int a)
{
	return 50+a;
}
int add(int a,int b)
{
	return 30+a+b;
}

7-1 出生年 (10分)

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:
1988 4

输出样例1:
25 2013

输入样例2:
1 2

输出样例2:
0 0001

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<math.h>
using namespace std;
int add(int a,int b,int c)
{
    return a+b+c;
}

int add (int a)
{
    return 50+a;
}
int add(int a,int b)
{
    return 30+a+b;
}
int prime(int n){
    int i;
    if(n<=1) return 0;
    if(n==2)return 1;
    for(i=2;i<=sqrt(n);i++) 
    if(n%i==0) return 0;
    return 1;
}

struct student
{
    char name[100];
    int hx;
    int mb; 
}s[1000];
long long int fibonacci(int n)
{
    long long int i,t;
    long long int a=1,b=1;
    if(n==0) return 0;
    if(n==1||n==2) return 1;
    for(i=3;i<=n;i++)
    {
        t=a;
        a=b;
        b=a+t;
    }
    return b;
}

int main()
{
    long long int n,f=0,m,y,j,i,k,l,t,s=0;
    int a[10]={0};
    cin>>y>>n;
    for(i=y;i<=3000;i++)
    {
        m=i;
        while(m)
        {
            t=m%10;
            a[t]++;
            m=m/10;
        }
        if(i<10) 
        a[0]=a[0]+3;

       if(i>9&&i<100)
       a[0]=a[0]+2;
       if(i>99&&i<1000)
       a[0]=a[0]+1;
        for(j=0;j<10;j++)
        {
            if(a[j]!=0)
            {
                f++;
                a[j]=0;
            }
        }
        if(i<10) 
        if(f==n)
        {
        printf("%d %04d",i-y,i);    
        break;
        }
       if(i>9&&i<100)
       if(f==n)
        {
        printf("%d %04d",i-y,i);    
        break;
        } 
       if(i>99&&i<1000)
       if(f==n)
        {
        printf("%d %04d",i-y,i);    
        break;
        }
       if(i>999)
        if(f==n)
        {
        printf("%d %d",i-y,i);  
        break;
        }
        f=0;
    }
    
    return 0;
}
    
    return 0;
}

7-2 Jack cheng的烦恼3 (10分)
Jack cheng在书上遇到一道编程题,可他不会做,没办法,他只好向你求助。题目要求判断给出的一个数是否为“真素数”。真素数的定义为:自身为素数,且自身各位数之和仍为素数。例如,11为素数,1+1=2也为素数,所以11为真素数。

输入格式:
输入在一行中给出需要判断的数n.

输出格式:
如果n为真素数,则输出“yes”,否则输出“no”。

输入样例:
11

输出样例:
yes

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<math.h>
using namespace std;
int add(int a,int b,int c)
{
	return a+b+c;
}

int add (int a)
{
	return 50+a;
}
int add(int a,int b)
{
	return 30+a+b;
}
int prime(int n){
	int i;
	if(n<=1) return 0;
	for(i=2;i<n;i++) 
	if(n%i==0) return 0;
	return 1;
}

struct student
{
    char name[100];
	int hx;
	int mb;	
}s[1000];
int main()
{
    int n,m,j,i,k,l,t,s=0;
    cin>>n;
    if(prime(n))
    {
    	m=n;
    	while(n)
    	{
    		t=n%10;
    		s=s+t;
    		n=n/10;
		}
		if(prime(s))
		{
		printf("yes");	
		return 0;
		}
		
	}
    printf("no");
	return 0;
}

7-3 验证“哥德巴赫猜想” (10分)
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:
24

输出样例:
24 = 5 + 19

作者: 徐镜春
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<math.h>
using namespace std;
int add(int a,int b,int c)
{
	return a+b+c;
}

int add (int a)
{
	return 50+a;
}
int add(int a,int b)
{
	return 30+a+b;
}
int prime(int n){
	int i;
	if(n<=1) return 0;
	if(n==2)return 1;
	for(i=2;i<=sqrt(n);i++) 
	if(n%i==0) return 0;
	return 1;
}

struct student
{
    char name[100];
	int hx;
	int mb;	
}s[1000];
int main()
{
    long long int n,m,j,i,k,l,t,s=0;
    cin>>n;
    for(i=2;i<=n/2 ;i++)
    {
    	if(prime(i)&&prime(n-i))
    	{
    		printf("%d = %d + %d",n,i,n-i);
    		break;
		}
	}
	return 0;
}

7-4 出租 (10分)
下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:
输入在一行中给出一个由11位数字组成的手机号码。

输出格式:
为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:
18013820100

输出样例:
int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

作者: 陈越
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<math.h>
using namespace std;
int add(int a,int b,int c)
{
    return a+b+c;
}

int add (int a)
{
    return 50+a;
}
int add(int a,int b)
{
    return 30+a+b;
}
int prime(int n){
    int i;
    if(n<=1) return 0;
    if(n==2)return 1;
    for(i=2;i<=sqrt(n);i++) 
    if(n%i==0) return 0;
    return 1;
}

struct student
{
    char name[100];
    int hx;
    int mb; 
}s[1000];
long long int fibonacci(int n)
{
    long long int i,t;
    long long int a=1,b=1;
    if(n==0) return 0;
    if(n==1||n==2) return 1;
    for(i=3;i<=n;i++)
    {
        t=a;
        a=b;
        b=a+t;
    }
    return b;
}

int main()
{
    long long int n,f=0,m,y,j,i,k=0,l,t,s=0;
    cin>>n;
    int a[10]={0};
    int b[10]={0};
    int c[10];
    for(i=0;i<10;i++)
    c[i]=-1;
    m=n;
    while(m)
    {
        t=m%10;
        a[t]++;
        m=m/10;
    }
printf("int[] arr = new int[]{");
    for(i=0;i<10;i++)
    {
        if(f==0&&a[i]!=0)
        {
        printf("%d",i); 
        f++;
         continue;
        }
        
        if(f!=0&&a[i]!=0)
        printf(",%d",i);
    }
    printf("};\n");

   

    return 0;
}

7-5 函数-斐波那契数列 (10分)
斐波那契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……。在数学上,斐波纳契数列以递推的方法定义为:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)。计算斐波那契数列第n项的值。

输入格式:

输入一个大于等于1,小于等于60的整数n。

输出格式:

输出第n项的数列值,数列值为double类型,不输出小数位数。

输入样例:

20

输出样例:

6765

输入样例:

1

输出样例:

1

作者: 韩玫瑰
单位: 济南大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<math.h>
using namespace std;
int add(int a,int b,int c)
{
	return a+b+c;
}

int add (int a)
{
	return 50+a;
}
int add(int a,int b)
{
	return 30+a+b;
}
int prime(int n){
	int i;
	if(n<=1) return 0;
	if(n==2)return 1;
	for(i=2;i<=sqrt(n);i++) 
	if(n%i==0) return 0;
	return 1;
}

struct student
{
    char name[100];
	int hx;
	int mb;	
}s[1000];
long long int fibonacci(int n)
{
	long long int i,t;
	long long int a=1,b=1;
	if(n==0) return 0;
	if(n==1||n==2) return 1;
	for(i=3;i<=n;i++)
	{
		t=a;
		a=b;
		b=a+t;
	}
	return b;
}
int main()
{
    long long int n,m,j,i,k,l,t,s=0;
    cin>>n;
    printf("%lld",fibonacci(n));
    
    
    
    
    
}

7-6 求n以内最大的k个素数以及它们的和 (10分)
本题要求计算并输出不超过n的最大的k个素数以及它们的和。

输入格式:
输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。

输出格式:
在一行中按下列格式输出:

素数1+素数2+…+素数k=总和值

其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。

输入样例1:
1000 10

输出样例1:
997+991+983+977+971+967+953+947+941+937=9664

输入样例2:
12 6

输出样例2:
11+7+5+3+2=28

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<math.h>
using namespace std;
int add(int a,int b,int c)
{
	return a+b+c;
}

int add (int a)
{
	return 50+a;
}
int add(int a,int b)
{
	return 30+a+b;
}
int prime(int n){
	int i;
	if(n<=1) return 0;
	if(n==2)return 1;
	for(i=2;i<=sqrt(n);i++) 
	if(n%i==0) return 0;
	return 1;
}

struct student
{
    char name[100];
	int hx;
	int mb;	
}s[1000];
long long int fibonacci(int n)
{
	long long int i,t;
	long long int a=1,b=1;
	if(n==0) return 0;
	if(n==1||n==2) return 1;
	for(i=3;i<=n;i++)
	{
		t=a;
		a=b;
		b=a+t;
	}
	return b;
}
int main()
{
    long long int n,f=0,m,j,i,k,l,t,s=0;
    cin>>n>>m;
    for(i=n;i>=1;i--)
    {
    	
		if(prime(i)&&f!=0)
		{
			printf("+%d",i);
			f++;
			s=s+i;
		}
		if(prime(i)&&f==0)
    	{
    		printf("%d",i);
    		f++;
    		s=s+i;
		}
		if(f==m)
		break;
	}
	printf("=%d",s);
}

实验心得和体会

函数第1题体会:

这一题需要用到重构函数,int,double,string类型分别相加

函数第2题体会:

这题的关键是修改地址,不可以用指针,只可以用地址修改,两数互换

函数第3题体会:

这一题需要用到重构函数,分别定义长方形的面积,和长方体的表面积

函数第4题体会:

这题主要是找出规律,第一个定义a+b,第二个定义a+50,第三个定义30+a+b

第1题体会:

这题需要分9-99 ,99-999,999-3000,三种情况,因为前导0算位,不然无法满足多少位不同的条件,但是要注意,不是到3000就停止,超高3000的满足条件的也要输出,不然会有一个2分的错误点,靠后问老师才知道。

第2题体会:

这题主要是定义一个验证素数的函数,并且要取出整数的各位数,相加求和,再验证两个数是否为素数

第3题体会:

这一题可以承接上一题的验证素数的函数,主要是从2,从n-2开始,从两头遍历,验证是否两个数都为素数

第4题体会:

这题不可定义为整型,因为含有前导0的不可输出(虽然手机号没看到开头有0的),定义一个数组,统计数组出现的次数,不为0的数组,从后往前统计,然后输出,再定义一个数组,遍历输入的手机号码,如果等于数组号输出所在的位置

第5题体会:

这题可以直接定义一个斐波拉西函数,有两种方法,第一中,先定义3个数,前两个存放斐波拉西的前两项,先让第三项等于前两项的和,然后把第二项复制给第一项,把和复制给第二项,最后只用输出第二项即可;第二种方法,定义一个很大的数组,然后算到要求的那一项,输出即可,个人倾向于第一种,因为,所占用的空间小,速度快

第6题体会:

上一题的斐波拉西函数仍然可以,只需要统计一下输出的个数,从后向前遍历,到指定的值停止即可。

发布了33 篇原创文章 · 获赞 14 · 访问量 614

猜你喜欢

转载自blog.csdn.net/Simple_questions/article/details/105067160
2.