GPLT练习集L1 9--16
L1-009 N个数求和 (20 分)
题目描述
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
*结尾无空行*
输出样例1:
3 1/3
*结尾无空行*
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,b,up,down=1;//up为分子,down为分母
int main() {
cin>>n;
while(n--) {
scanf("%lld/%lld",&a,&b);
up=up*b+a*down; /*通分*/
down*=b;
ll k=abs(__gcd(up,down));
up /= k; /*约分*/
down /= k;
}
if(up%down==0) cout<<up/down<<endl; /*结果为整数*/
else {
ll M = up/down;
if(M)cout<<M<<' '; /*结果大于1*/
cout<<up-M*down<<'/'<<down<<endl;
}
return 0;
}
/*
2
2/5 4/15
①
a = 2;b = 5;
up = 0*5+2*1 = 2;
down = 1*5 = 5;
k = 1;
up = 2/1 = 2;
down = 5/1 = 5;
②
up = 2*15+4*5 = 50;
down = 15*5 = 75;
k = 25;
up = 50/25 = 2;
down = 75/25 = 3;
*/
说明
-
依
题
目
意
思
,
分
子
分
母
为
l
o
n
g
型
,
但
可
能
相
加
超
过
其
依题目意思,分子分母为long型,但可能相加超过其
依题目意思,分子分母为long型,但可能相加超过其
long
型 , 所 以 定 义 为 型,所以定义为 型,所以定义为long long
型 较 为 保 险 型较为保险 型较为保险 - 本 题 的 思 路 就 是 按 照 平 常 手 算 的 步 骤 来 处 理 , 先 通 分 相 加 ( a 1 ∗ b 2 + a 2 ∗ b 1 ) , 后 之 和 约 分 ( a / g c d b / g c d ) 本题的思路就是按照平常手算的步骤来处理,先通分相加(a_1*b_2+a_2*b_1),后之和约分(\frac{a/gcd}{b/gcd}) 本题的思路就是按照平常手算的步骤来处理,先通分相加(a1∗b2+a2∗b1),后之和约分(b/gcda/gcd)
L1-010 比较大小 (10 分)
题目描述
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
*结尾无空行*
输出样例:
2->4->8
*结尾无空行*
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int num[3];
for(int i = 0 ; i < 3 ; i++)
cin >> num[i];
sort(num,num + 3);
cout<<num[0]<<"->"<<num[1]<<"->"<<num[2];
return 0;
}
L1-011 A-B (20 分)
题目描述
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10^4 ,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
*结尾无空行*
输出样例:
I lv GPLT! It's fn gm!
*结尾无空行*
代码
方法一
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
const int MAX = 200;
int s3[MAX];
int main() {
getline(cin , s1);
getline(cin , s2);
for(int i = 0 ; i < s2.size() ; ++i)
s3[s2[i]] = 1;//若是要删除的字符,就记为1
for(int i = 0 ; i < s1.size() ; ++i)
if(!(s3[s1[i]]))
cout << s1[i];
return 0;
}
说明
- 本 题 的 思 路 就 是 利 用 下 标 相 等 的 思 想 来 判 断 其 字 符 是 否 在 目 标 字 符 串 中 本题的思路就是利用下标相等的思想来判断其字符是否在目标字符串中 本题的思路就是利用下标相等的思想来判断其字符是否在目标字符串中
- 需 要 创 建 一 个 数 组 来 存 储 数 据 需要创建一个数组来存储数据 需要创建一个数组来存储数据
方法二
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
int main() {
getline(cin , s1);
getline(cin , s2);
int k;
for(int i = 0 ; i < s2.size() ; ++i)
while((k = s1.find(s2[i])) != -1)
s1.erase(k,1);
cout << s1;
return 0;
}
说明
- 本 题 的 思 路 就 是 利 用 f i n d ( ) 函 数 来 代 替 循 环 遍 历 查 找 字 符 串 , 如 果 找 到 就 删 除 本题的思路就是利用find()函数来代替循环遍历查找字符串,如果找到就删除 本题的思路就是利用find()函数来代替循环遍历查找字符串,如果找到就删除
L1-012 计算指数 (5 分)
题目描述
真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2^n 。不难吧?
输入格式:
输入在一行中给出一个不超过 10 的正整数 n。
输出格式:
在一行中按照格式 2^n = 计算结果 输出 2^n的值
输入样例:
5
*结尾无空行*
输出样例:
2^5 = 32
*结尾无空行*
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
cout<<"2^"<<n<<" = "<<(int)pow(2,n);
return 0;
}
L1-013 计算阶乘和 (10 分)
题目描述
对于给定的正整数N,需要你计算 S=1!+2!+3!+…+N!。
输入格式:
输入在一行中给出一个不超过10的正整数N。
输出格式:
在一行中输出S的值。
输入样例:
3
*结尾无空行*
输出样例:
9
*结尾无空行*
代码
#include <bits/stdc++.h>
using namespace std;
int n , a = 1, b ;
int main() {
cin >> n;
for(int i = 1 ; i <= n ; i++) {
a *= i;
b += a;
}
cout<<b;
return 0;
}
L1-014 简单题 (5 分)
题目描述
这次真的没骗你 —— 这道超级简单的题目没有任何输入。
你只需要在一行中输出事实:This is a simple problem. 就可以了。
输入样例:
无
*结尾无空行*
输出样例:
This is a simple problem.
*结尾无空行*
代码
#include <iostream>
using namespace std;
int main() {
cout<<"This is a simple problem.";
return 0;
}
L1-015 跟奥巴马一起画方块 (15 分)
题目描述
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。
输出格式:
输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
输入样例:
10 a
*结尾无空行*
输出样例:
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
*结尾无空行*
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
char ch;
cin >> n >> ch;
for(int i = 0 ; i < (int)((double)n/2 + 0.5) ; i++) {//四舍五入
for(int j = 0 ; j < n ; j++)
cout<<ch;
cout<<endl;
}
return 0;
}
L1-016 查验身份证 (15 分)
题目描述
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed
。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
*结尾无空行*
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
*结尾无空行*
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int b[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//Z
char m[] = {'1','0','X','9','8','7','6','5','4','3','2'};//M
int j = 0;
while(n--) {
string s;
cin >> s;
int sum = 0;
for(int i = 0 ; i < 17 ; i++)
sum += (s[i]-'0')*b[i];
if(m[sum%11] != s[17]) {
++j;
cout<<s<<endl;
}
}
if(!j)
cout<<"All passed";
return 0;
}