山大程序设计思维与实践作业week1-算法复杂度与程序调试

山东大学计算机科学与技术学院程序设计思维与实践作业
山大程序设计思维与实践作业
sdu程序设计思维与实践
山东大学程序设计思维实践作业H1
山大程序设计思维实践作业H1
山东大学程序设计思维与实践
程序设计思维与实践
week1-算法复杂度与程序调试
相关资料:GitHub

B : Slot

问题描述
给出一个长度为 3 的字符串,所有字母均为大写英文字母,请判断该字符串是否由同一个字母构成。

输入格式
输入一行表示字符串。

输出格式
若该字符串是否由同一个字母构成,输出 Won,否则输出 Lost。

样例输入 1
TTT
样例输出 1
Won
样例输入 2
SYS
样例输出 2
Lost

#include <iostream>
using namespace std;

int main()
{
    char a[4];
    cin >> a;
    if (a[0] == a[1] && a[1] == a[2]) cout << "Won";
    else cout << "Lost";
}

C : Discount

C : Discount
问题描述
给出商品的原价和现价,求该商品的优惠力度

输入格式
输入两个数 A,B(1≤B<A≤10^5),分别表示原价和现价。

输出格式
输出一个实数,表示降价的百分比,保留三位小数输出。

样例输入
7 5
样例输出
28.571

#include <iomanip>
#include "iostream"
using namespace std;
int main(){
    float a,b,result;
    cin>>a>>b;
    result=(a-b)/a*100;
    cout<<fixed<<setprecision(3)<<result;
}

D : Orthogonality

问题描述
给出两个 N 维向量 A=(A1,A2,A3,…,AN) 和 B=(B1,B2,B3,…,BN),判断他们的内积是否等于 0。
换句话说,你需要判断等式 A1B1+A2B2+A3B3+⋯+ANBN=0是否成立。
输入格式
第一行一个整数 N,接下来两行分别有 N 个整数,分别表示向量 A,B。
1≤N≤105,−100≤Ai,Bi≤100
输出格式
若两个向量的内积等于 0,输出 Yes,否则输出 No。
样例输入 1
3
1 0 5
-5 0 1
样例输出 1
Yes
样例输入 2
3
1 2 3
3 2 1
样例输出 2
No

#include<iostream>
using namespace std;
int main(){
    int n,sum=0;
    cin>>n;
    int a[n];
    int b[n];
    for (int i = 0; i < n; ++i) {
        cin>>a[i];
    }
    for (int i = 0; i < n; ++i) {
        cin>>b[i];
    }
    for (int i = 0; i < n; ++i) {
        sum+=a[i]*b[i];
    }
    if(sum==0)
        cout<<"Yes";
    else
        cout<<"No";
    return 0;
}

E : uNrEaDaBlE sTrInG

问题描述
我们称一个字符串是“难读的”,当且仅当它的奇数位置的字母都是小写字母,偶数位置的字母都是大写字母。请你判断一个字符串是否为“难读的”字符串。

输入格式
输入一行包含一个字符串。

输出格式
如果输入的字符串是“难读的”,输出 Yes,否则输出 No。

样例输入 1
tImElImItExCeEdEd
样例输出 1
Yes
样例输入 2
AccePt
样例输出 2
No

#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
	string s;
    int f = 1;
    cin >> s;
    int n=s.length();
    for (int i = 0; i < s.length(); i++)
    {
        if (i % 2 == 0) {if ( s[i] < 97 || s[i] > 122) f = 0; }
        else if(s[i] < 65 || s[i] > 90) f = 0;
    }
    if (f == 1) cout << "Yes";
    else cout << "No";
}

F : Remove It

问题描述
给出一个长度为 n 的数列和一个数 x,请从数列中删除数值等于 x 的项,输出剩余的数列。

输入格式
输入第一行包含两个整数 n,x,第二行包含 n 个整数,表示数列。

输出格式
输出一行,表示删除后的数列。输出数字的相对顺序应与原数列相同。

样例输入 1
6 4
1 2 3 4 3 4
样例输出 1
1 2 3 3
样例输入 2
3 6
6 6 6
样例输出 2

#include "iostream"
using namespace std;
int main(){
    int n,x;
    cin>>n>>x;
    int a[n];
    for (int i = 0; i < n; ++i) {
        cin>>a[i];
    }
    for (int i = 0; i < n; ++i) {
        if (a[i]!=x){
        	cout<<a[i]<<" ";
		}  
    }
}

G : Rally

问题描述
有 n 个人居住在数轴的整数位置上,第 i 个人的位置是 xi。现需要选定一个整数位置 p,使所有人移动到 p 并使得所有人的代价之和最小,第 i 个人移动的代价为 (xi−p)2,求最小代价。
输入格式
第一行一个整数 n,接下来一行有 n 个整数,表示每个人的位置。
1≤n≤100,1≤xi≤100
输出格式
输出一个整数,表示最小代价。
样例输入
6
5 2 4 2 8 8
样例输出
37

#include<stdio.h>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int n;
	int x=0;
	int a[100];
	int result=0;
	cin>>n;
	for(int i=0;i<n;i++){ cin>>a[i]; x += a[i];}
	x = round(double(x)/n);
	for(int i=0;i<n;i++){ result += (x-a[i])*(x-a[i]);}
	cout << result;
}

H : : (Colon)

问题描述
钟表的时针和分针长度分别为 a,b,当前的时间为 H 时 M 分,求时针端点与分针端点的距离。

输入格式
输入一行包含 4 个整数 a,b,H,M。

输出格式
输出一个实数,表示端点之间的距离。你的输出与实际值的误差应小于 10^−9

样例输入
3 4 10 40
样例输出
4.56425719433005567605
10:40
在这里插入图片描述

#include<iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
    double a,b,H,M;
    long double pi=3.14159265358979323846264338327950288419716939937510582097494459230781640;
    cin>>a>>b>>H>>M;
    H=H*30+M*0.5;
    M=M*6.0;
    long double temp=abs(H-M);
    cout<<fixed<<setprecision(11)<<sqrt(a*a+b*b-2*a*b* cos((temp/180.0)*pi))<<endl;
    return 0;
}

I : Kaprekar Number

问题描述
定义函数 g1(x),g2(x),f(x),x>0 如下:
• g1(x)= 将 x 的各位数字按照降序排序
• g2(x)= 将 x 的各位数字按照升序排序,忽略前导零
• f(x)=g1(x)−g2(x)
例如,g1(318)=831, g2(1024)=124, f(271)=721−127=594。
给出整数 N,K, 定义数列 a0=N,ai+1=f(ai)(i≥0),求 aK.
输入格式
输入一行包含两个整数 N,K;N≤109,K≤105。
输出格式
输出一个整数表示 aK
样例输入 1
1024 2
样例输出 1
8172
样例输入 2
10 3
样例输出 2
0

#include<iostream>
#include<cmath>
using namespace std;

int ma10[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int f(int n){
	int aa[10];
	int l,cc=0,dd=0,x=0;
	for(int i=0;i<10;i++){aa[i] = n%10;n /= 10; if(n ==0 ){l = i+1; break;}}
	for(int i=9;i>=0;i--){for(int j=0;j<l;j++)if(aa[j]==i){cc = cc*10 + aa[j];dd = ma10[x]*aa[j] + dd;aa[j]=-1;x++;}}return cc-dd;
	} 
int main(){
	int n,k;
	cin>>n>>k;
	for(int i=0;i<k;i++){n = f(n);}
	cout<<n;
}


 

J : IO1

计算 a+b

Input
输入第一行是一个整数 N,代表接下来 N 行会有 N 组样例输入。

Output
每组输出占一行。

Sample Input
2
1 5
10 20
Sample Output
6
30

#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    for (int i = 0; i <n ; ++i) {
        int a,b;
        cin>>a>>b;
        cout<<(a+b)<<endl;
    }
    return 0;
}

K : IO2

B - IO2
计算 a+b

Input
有多组样例输入,以 0 0 代表输入结束。

Output
每组输出占一行

Sample Input
1 5
10 20
0 0
Sample Output
6
30

#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    cin>>a>>b;
    while (!(a==0&&b==0)) {
    	c=a+b;
        cout<<c<<endl;
        cin>>a>>b;
    }
    return 0;
}

L : IO3

问题描述
计算 a+b

输入格式
有多组样例输入

输出格式
每组输出占一行

样例输入
1 5
10 20
样例输出
6
30

#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    while ((cin>>a>>b)) {
    	c=a+b;
    	cout<<c<<endl;
	}   
    return 0;
}

M : IO4

问题描述
你的任务是计算一些整数的和

输入格式
输入包含多组样例。
每组样例包含一个整数 N,然后在同行有 N 个整数。
若 N = 0,则表示输入结束,这个样例不需要被处理。

输出格式
对于每组用例,你应当输出这组样例 N 个数字的和,每个输出占一行。

样例输入
4 1 2 3 4
5 1 2 3 4 5
0
样例输出
10
15

#include<iostream>
using namespace std;

int main()
{
	int N,x;
	while(cin>>N)
	{			
		if(N==0)  {break;}
		int result=0;
		for(int i=0;i<N;i++){cin>>x;result=result+x;}
		cout<<result<<endl;
	}
	return 0;
}

N : IO5

问题描述
请计算下面每行数的和。

输入格式
第一行有一个整数 N,表示有 N 行数。接下来 N 行,每行第一个为整数 M,表示本行后面有 M 个整数。

输出格式
对于输入的每一行数,请分别对应输出每一行数的和。

样例输入
2
4 1 2 3 4
5 1 2 3 4 5
样例输出
10
15
Hint
本题相关知识:输入输出和循环语句(for)的使用方式。

#include<iostream>
using namespace std;
int main(){
	int m,n,a;
	cin>>m;
	while(m--){
		cin>>n;
		int sum=0;
		while(n--){
			cin>>a;
			sum+=a;
		}
		cout<<sum<<endl;
	} 
}

O : IO6

问题描述
请计算下面每行数的和。

输入格式
输入包含多组数据,每组数据占一行。每行第一个数为整数 N,后面有 N 个整数

输出格式
对于输入的每一行数,请分别对应输出每一行数的和。

样例输入
4 1 2 3 4
5 1 2 3 4 5
样例输出
10
15
Hint
本题相关知识:输入输出和循环语句(while)的使用方式。

#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
	int n;
	while(scanf("%d",&n) != EOF){
		int sum=0,a;
		while(n--){
			scanf("%d",&a);
			sum+=a;
		}
		printf("%d\n",sum);
	} 
}

P : IO7

问题描述
请计算下面每行数的和。

输入格式
输入包含多组数据,每组数据占一行。每行有若干个整数

输出格式
对于输入的每一行数,请分别对应输出每一行数的和。

样例输入
1 2 3 4
1 2 3 4 5
样例输出
10
15
Hint
本题相关知识:读取一行的处理和格式化读取字符串,也可使用 getline 和 stringstream。

#include<iostream>
#include <sstream>
using namespace std;
int main(){
    string str1;
    while (getline(cin,str1))
    {
        istringstream s(str1);
        string p;
        int sum=0;
        while (s>>p){sum+=std::stoi(p);}
        cout<<sum<<endl;
    }
}

Q : IO8

问题描述
给定两个十六进制整数 a 和 b,输出他们的和

输入格式
输入多组数据,以 EOF 作为数据的结束
每组数据在一行中包含了两个十六进制整数 a 和 b。

输出格式
对于每一组数据,以十进制输出 a+b 的和。
每组输出占用一行。

样例输入
1 9
A B
a b
样例输出
10
21
21

#include<stdio.h>
using namespace std;
int main(){
	int a,b; 
	while(scanf("%x%x",&a,&b) != EOF){
		printf("%d\n",a+b);
	}
}
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高级程序设计语言(a)课程是山东大学2015-2016学年1学期的一门重要课程,旨在帮助学生掌握高级程序设计语言的基本原理和应用技巧。在这门课程中,我们不仅学习了高级程序设计语言的基本概念和语法规则,还深入了解了面向对象的程序设计思想和方法。通过学习,我们不仅可以掌握高级程序设计语言的编程技巧,还可以培养解决问题和创新思维的能力。 在课程学习过程中,我们通过理论学习和实际操作相结合的方式,深入理解了高级程序设计语言的核心知识。通过课堂讲解和实践练习,我们逐渐掌握了面向对象的程序设计方法,并且学会了如何利用高级程序设计语言进行程序开发和调试。同时,我们对常用的数据结构和算法也有了更深入的了解和掌握。 在课程的学习过程中,老师们不仅传授了知识,还引导我们进行实际的编程练习,培养了我们的动手能力和解决问题的能力。通过大量的编程实践,我们逐渐掌握了高级程序设计语言的应用技巧,能够独立完成一些小型的程序开发项目。 总的来说,这门高级程序设计语言(a)课程不仅帮助我们掌握了高级程序设计语言的基本知识和技能,还培养了我们的动手能力和解决问题的能力。通过这门课程的学习,我们在程序设计方面得到了很大的提升,为以后的学习和工作打下了坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值