实验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(c3){
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题体会:
上一题的斐波拉西函数仍然可以,只需要统计一下输出的个数,从后向前遍历,到指定的值停止即可。