2024年春季《算法分析与设计》热身练习题

A:I love HNUCM

2020年是HNUCM本科教育60周年,为了表达对HNUCM的爱意,TC希望你能够编写一个程序帮他表达心声。
输入一个正整数n(n<=100),输出n次“I love HNUCM.”。

输入

一个正整数n(n<=100)。

输出

n次“I love HNUCM.”。

样例输入

样例输出

I love HNUCM.

I love HNUCM.

#include<iostream>
using namespace std;
int n;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>n;
	while(n--) cout<<"I love HNUCM.\n";
}2

B:计算球体积

根据输入的半径值,计算球的体积。(提示:#define PI 3.1415927)

输入

输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。

输出

输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。

样例输入

1

1.5 

样例输出
4.189

14.137 

#include<iostream>
#define PI 3.1415927
using namespace std;
double r;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	while(cin>>r) printf("%.3lf\n",PI*r*r*r*4/3);
}

C:成绩转换

输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;

输入

输入数据有多组,每组占一行,由一个整数组成。

输出

对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。

样例输入

56

67

100

123 

样例输出

E

D

A

Score is error!

#include<iostream>
using namespace std;
int n;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	while(cin >> n){
		if (n > 100 || n < 0) puts("Score is error!");
		else if (n >= 90) puts("A");
		else if (n >= 80) puts("B");
		else if (n >= 70) puts("C");
		else if (n >= 60) puts("D");
		else puts("E");
	}
}

D:求奇数的乘积

给你n个整数,求他们中所有奇数的乘积。

输入

输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。

输出

输出每组数中的所有奇数的乘积,对于测试实例,输出一行。 

样例输入

3 1 2 3

4 2 3 4 5

样例输出

3

15 

#include<iostream>
using namespace std;
typedef long long ll; 
int n,x;
ll s;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	while(cin>>n){
        s=1;
        while(n--){
            cin>>x;
            if(x%2) s*=x;
        }
        cout<<s<<'\n';
    }
}

E:平方和与立方和

给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。

输入

输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。

输出 

对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。

样例输入

1 3

2 5 

样例输出

4 28

20 152 

#include<iostream>
using namespace std;
typedef long long ll; 
int n,m,s1,s2;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	while (cin>>n>>m){
		s1=s2=0;
		if(n>m) swap(n,m);
		for (int i=n;i<=m;i++)
			if(i%2==0) s1+=i*i;
			else s2+=i*i*i;
		cout<<s1<<' '<<s2<<'\n';
	}
	return 0;
}

F:水仙花数

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。

输入

输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。

输出 

对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。

样例输入

100 120

300 380 

样例输出

no

370 371 

#include<iostream>
using namespace std;
typedef long long ll; 
int n,m;
bool flag;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	while(cin>>n>>m) {
		flag=true;
		for(int i=n;i<=m;i++){
			int a=i/100,b=i/10%10,c=i%10;
			if(a*a*a+b*b*b+c*c*c==i){
				flag=false;
				cout<<i<<' ';
			}
		}
		if(flag) cout<<"no";
		cout<<'\n';
	}
	return 0;
}

G:母牛的故事

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

 输出

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0 n=0表示输入数据的结束,不做处理。

样例输入

2

4

5

样例输出

2

4

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=55;
int n,m;
bool flag;
ll a[N];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	a[1]=1,a[2]=2,a[3]=3,a[4]=4;
	for (int i=5;i<N;i++) a[i]=a[i-1]+a[i-3];
	while (cin>>n&&n) cout<<a[n]<<'\n';
	return 0;
}

H:奇数三角形

一个全由奇数组成的数字三角形,该三角形共有n层。
第m层包含m个从大到小且相邻两个数字相差2的奇数,第m层最后一个数的值为2m-1。
当n为2时该奇数三角形如下:
1
5 3
当n为4时该奇数三角形如下:
1
5 3
9 7 5
13 11 9 7
现在输入一个正整数n,表示奇数三角形的层数,请编写一个程序输出该奇数三角形。

输入

单组输入。
输入一个不超过100的正整数n,表示奇数三角形的层数。

输出

输出一个n层的奇数三角形(同一层中相邻的两个数字之间用一个英文空格隔开)。

样例输入

样例输出 

5 3

9 7 5

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=55;
int n;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>n;
    for(int i=0;i<n;i++){
        for(int j=4*i+1;j>=i*2;j-=2)
            cout<<j<<' ';
        cout<<'\n';
    }
	return 0;
}

I:奶牛牧场

美丽的含浦有一片奶牛牧场,牧场上的牧草每天都在匀速生长。
已知这片牧场可供N1头奶牛吃D1天,也可以供N2头奶牛吃D2天(D1>D2,N1*D1>N2*D2)。
请问,这片奶牛牧场每天新生的草量可以供几头奶牛吃1天?

输入

单组输入,每组两行。
第1行输入两个正整数N1和D1,均不超过100。
第2行输入两个正整数N2和D2,均不超过100。
已知输入数据满足D1>D2且N1*D1>N2*D2。

输出

计算每天新生草量可以供多少头奶牛吃1天,输出奶牛的头数。 

样例输入

20 15

25 10 

样例输出

10 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=55;
int N1,N2,D1,D2;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>N1>>D1>>N2>>D2;
    cout<<(N1*D1-N2*D2)/(D1-D2)<<'\n';
	return 0;
}

J:奇数统计

K:最萌身高差

N个(3<=N<=1000)X星人站成一行,每个X星人的身高都是一个正整数(范围:100-300,单位:厘米)。
计算相邻两个X星人的身高差(身高差为非负数),其中最大的身高差称为最萌身高差。请编写一个程序输出由N个X星人排成的这一行的最萌身高差。

输入

单组输入。
第1行输入一个正整数N(3<=N<=1000)。
第2行输入N个正整数,分别表示每一个X星人的身高,每一个正整数的范围为[100, 300],两两之间用英文空格隔开。

输出

输出一个非负整数表示这一行X星人的最萌身高差。 

样例输入

5

120 178 156 172 200 

样例输出

58 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=55;
int n,x,y,ma;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>n>>x;
    n--;
    while(n--){
        cin>>y;
        ma=max(ma,abs(y-x));
        x=y;
    }
    cout<<ma<<'\n';
	return 0;
}

L:XP的电灯

XP最近发现一个很好玩的问题。现在有N盏电灯,序号为1到N,最开始的时候所有电灯都是关闭的。XP有一群同学,序号是(1~K),这些调皮的同学会去按电灯的开关,每个同学按开关符合一种规律。序号为1的同学会按下序号是1的倍数的灯的开关,序号是2的同学会按下序号是2的倍数的灯的开关(将关的灯打开,开的灯关闭)。现在XP有K位同学,每位同学都去操作一次,问最后有多少盏灯是亮着的?

输入

每行输入两个整数,N,K(K<=N<=1000) 

输出

每行输入一个整数,表示打开电灯的数量。 

样例输入

2 2

10 10

样例输出

1

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e3+5;
int n,m,cnt;
bool st[N];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	while(cin>>n>>m){
		int cnt=0;
		for(int i=1;i<=n;i++) st[i]=false;
		for(int i=1;i<=m;i++)
			for(int j=i;j<=n;j+=i)
				if(st[j]) st[j]=false;
				else st[j]=true;
		for (int i=1;i<=n;i++) if(st[i]) cnt++;
		cout<<cnt<<'\n';
	}
	return 0;
}

M:价值几何

鸡兔共笼问题是一个非常经典的数学问题。
现在告诉你笼子中的鸡和兔共有m只,脚共有n只,且已知鸡的价格为每只100元,兔子的价格为每只150元。
请问这一笼鸡和兔共值多少钱?
如果问题无解则输出“No solution”。
1<=m<=1000,1<=n<=1000。

输入

两个整数m和n(意义如题目描述所示),用空格分隔

输出

如果问题有解,则输出一个整数,表示这一笼鸡和兔共值多少钱。
如果问题无解,则输出“No solution”(没有引号) 

样例输入

5 16 

样例输出

650 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e3+5;
int n,m,a,b;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>m>>n;
	a=(4*m-n)/2,b=(n-2*m)/2;
	if (a<0||b<0||a+b!=m) cout<<"No solution\n";
	else cout<<a*100+b*150<<'\n';
	return 0;
}

N:HNUCM本科教育60周年

1960年是HNUCM的本科教育元年,今年是HNUCM创办本科教育60周年。
现在需要在一个大型LED显示屏上显示60两个数字。每个数字均占5行,但是所占列的数量由用户输入。
例如当用户输入4时,输出结果如下:
1111  1111
1000  1001
1111  1001
1001  1001
1111  1111
当用户输入6时,输出结果如下:
111111  111111 
100000  100001
111111  100001
100001  100001
111111  111111
两个数字之间用两个空格隔开。
观察上述两组输出的规律,然后编写一个程序,输入每个数字所占列数n(3<=n<=10),输出60对应的字符画。

输入

一个正整数n,如题所示。

输出

根据题目描述,写出60对应的字符画 

样例输入

样例输出

1111  1111

1000  1001

1111 1001

1001 1000

1111 1111

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e3+5;
int n;
string s1,s2,s3;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin>>n;
	for(int i=0;i<n;i++){
		s1+='1';
		if(i==0||i==n-1) s2+='1';
		else s2+='0';
		if (i==0) s3+='1';
		else s3+='0';
	}
	for(int i=0;i<5;i++){
		if (i==0||i==4) cout<<s1<<"  "<<s1<<'\n';
		else if(i==1) cout <<s3<<"  "<<s2<<'\n';
		else if(i==2) cout <<s1<<"  "<<s2<<'\n';
		else cout<<s2<<"  "<<s2<<'\n';
	}
	return 0;
}

O:海底沉船

X星人在一艘海底沉船上发现了很多很多很多金币,可爱的X星人决定用这些金币来玩一个填格子的游戏。
其规则如下:第1个格子放2枚金币,第2个格子放6枚金币,第3个格子放12枚金币,第4个格子放20枚金币,第5个格子放30枚金币,以此类推。
请问放到第n个格子时一共放了多少枚金币?

输入

多组输入。每组一个正整数n,表示最后一个格子的编号。(n<=100)

输出

对于每一组输入,输出从第1个格子到第n个格子的总金币数。 

样例输入

1

样例输出

2

20 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e2+5;
ll f[N]={0,2},s[N]={0,2};
int n;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    for(int i=2;i<=100;i++) {
        f[i]=f[i-1]*2-f[i-2]+2;
        s[i]=s[i-1]+f[i];
    }
    while(cin>>n) cout<<s[n]<<'\n';
    return 0;
}

P:粗心的小表弟

今天英语课,小表弟的英语老师教了他三个与动物有关的单词,分别是cat、pig和horse,但是粗心的小表弟在写这三个单词的时候经常会写错。
假如小表弟每个单词最多写错一个字母(当然有时候也是会全部写对的,且字母个数是完全正确的)。
你能否编写一个程序,对小表弟写的单词进行自动纠错。

输入

单组输入。
输入一个可能存在单个字母错误的单词。 

输出

输出与输入对应的正确单词。 

样例输入

hoose 

样例输出

horse 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e2+5;
int ans;
string a="pig",b;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>b;
    if(b.size()==5) puts("horse");
    else {
        for(int i=0;i<3;i++)
            if(b[i]==a[i]) ans++;
        if(ans>=2) puts("pig");
        else puts("cat");
    }
    return 0;
}

Q:十六进制

小米同学最近在学习进制转换。众所周知,在表示十六进制数时,除了0-9这九个阿拉伯数字外,还引入了“A”、“B”、“C”、“D”、“E”和“F”这六个英文字母(不区分大小写)。
现在给你一个十进制正整数,请问在将其转换为十六进制之后,对应的十六进制表示中有多少位是字母?

输入

单组输入。
输入一个十进制正整数N(N<=10^6)。

输出

输出将N转换成十六进制数字后所包含的字母位的数量,如果没有字母位则输出0。 

样例输入

20 

样例输出

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e2+5;
int n,cnt;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
	while(n){
		if(n%16>=10) cnt++;
		n/=16;
	}
	cout<<cnt<<'\n';
    return 0;
}

R:平行四边形

Kimi想用“*”号构成一个平行四边形并在屏幕上输出。
当输入一个大于等于2的正整数N时,屏幕上将显示一个由N*N个“*”组成的平行四边形。
例如:输入3,输出如下平行四边形。
  ***
 ***
***

输入

输入一个正整数N,1<N<=100。 

输出 

输出一个N行,每行N个“*”组成的平行四边形。

样例输入

样例输出

  ***

 ***

*** 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e2+5;
int n;
string s;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
	for(int i=0;i<n;i++) s+='*';
	for(int i=n-1;i>=0;i--) {
		for(int j=0;j<i;j++) cout<<' ';
		cout<<s<<'\n';
	}
    return 0;
}

S:临时换人

因为某些原因,Jack和Rose没有办法参加毕业演出,他们两个的工作任务都将由劳模Tom来代替。
现在需要更新演职人员名单,将所有的Jack和Rose替换成Tom。
请你编写一段程序实现人员替换功能。

输入

单组输入。
输入一个字符串(可能有空格,字符串长度<=1e5),包含若干Jack和Rose。

输出

输出替换之后的字符串。 

样例输入

Cameraman: Jack, Lighting engineer: Rose.

样例输出

Cameraman: Tom, Lighting engineer: Tom. 

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e2+5;
string b;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    getline(cin,b);
    while(1){
        int i=b.find("Jack"),j=b.find("Rose");
        if(i!=-1) b=b.substr(0,i)+"Tom"+b.substr(i+4);
        else if(j!=-1) b=b.substr(0,j)+"Tom"+b.substr(j+4);
        else break;
    }
    cout<<b<<'\n';
    return 0;
}

T:第n个数

自从学了素数以后,明明喜欢上了数字2、3和5。当然,如果一个数字里面只出现2、3和5这三个数字,他也一样喜欢,例如222、2355、223355。
现在他希望你能够帮他编写一个程序,快速计算出由2、3、5这三个数字组成的由小到大的第n个数,当然也包括2、3和5。

输入

每组输入数据占1行,每行输入一个正整数n。(n<=1000)

输出

每组输出数据占1行,即满足要求的第n个数。 

样例输入

样例输出

#include<iostream>
using namespace std;
typedef long long ll; 
const int N=1e3+5;
ll a[N];
int n,s,m,z,j;
int t=10,x=12,y=3;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    a[0]=2,a[1]=3,a[2]=5;
    for (int i=3;i<1000;i++){
        a[i]+=a[s]*t+a[m];
        z++;
        m++;
        if((x-y)/3==z){
            s++;
            z=0;
            m=j;
        }
        if(s==3){
            s=0;
            m=y;
            j=m;
            y=x;
            x+=(x - m)*3;
            t*=10;
        }
    }
    cin>>n;
    cout<<a[n-1]<<'\n';
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值