山东大学计算机科学与技术学院程序设计思维与实践作业
山大程序设计思维与实践作业
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);
}
}