『ACM C++』 PTA 天梯赛练习集L1 | 007-011
真的是忙头晕了,学业、ACM打题、班级活动、自学新东西,哇这充实的大学~
------------------------------------------------L1-007----------------------------------------------------------
念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
输入样例:
-
输出样例:
fu liu ling ling
------------------------------------------------L1-007----------------------------------------------------------
注:水题,熟练使用字符指针数组就没有问题了。如这里的:const char* proun[10] = { "ling", "yi", "er", "san","si","wu","liu","qi","ba","jiu" };
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
const char* proun[] = { "ling", "yi", "er", "san","si","wu","liu","qi","ba","jiu" };
char Input[];
int length;
int main()
{
scanf("%s",&Input);
length = strlen(Input);
for(int i = ;i<length;i++)
{
if(Input[i] == '-') printf("fu");
else printf(proun[Input[i] - '']);
if(i!=length-) printf(" ");
else printf("\n");
}
return ;
}
------------------------------------------------L1-008----------------------------------------------------------
求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例:
-
输出样例:
- - - Sum =
------------------------------------------------L1-008----------------------------------------------------------
注解:水题,一个循环带过
#include<stdio.h> int A,B,counter,sum;
int main()
{
scanf("%d%d",&A,&B);
counter = sum = ;
for(int i = A;i<=B;i++)
{
sum+=i;
if(counter == )
{
counter = ;
printf("\n");
}
printf("%5d",i);
counter++;
}
printf("\nSum = %d\n",sum);
return ;
}
------------------------------------------------L1-009----------------------------------------------------------
N个数求和
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
/ / / -/ /
输出样例1:
/
输入样例2:
/ /
输出样例2:
输入样例3:
/ -/ /
输出样例3:
/
------------------------------------------------L1-009----------------------------------------------------------
注解:这题我居然WA了好一会,出现了两个问题,一个是叠乘超出long long int的问题,一个就是出现了/0的情况。下面进行分析:
· 代码分块:
第一步:先套用获取最小公倍数的模板:
long long gcd(long long m, long long n)
{
return (m==)?n:gcd(n%m, m);
}
long long lcm(long long a, long long b)
{
return a / gcd(a, b) * b;
}
第二步:得到化简功能函数!!
void hj(long long int &a,long long int &b)
{
long long int m,n,p;
m=a;n=b;p=m%n;
while(p!=)
{
m=n;n=p;
p=m%n;
}
if(n!=) //化为最简分式
{
a/=n;
b/=n;
}
if(b<) //处理分母为复数
{
a=-a;
b=-b;
}
}
第三步:输入的同时进行通分、加和,最重要的是一定要记得时刻化简!!原本有一个test3测试点疯狂的出错,我看到了不超过长整形,所以用了long long int,但是突然想到,如何是加和乘积,是极有可能爆long long int的,所以要时刻进行化简,就过了。
for(int i = ;i<times;i++)
{
scanf("%lld/%lld",&temp_up,&temp_down);
long long int temp = lcm(temp_sumdown,temp_down);
if(temp_sumdown<temp) temp_sumup*=(temp/temp_sumdown);
if(temp_down<temp) temp_up*=(temp/temp_down);
temp_sumdown = temp;
temp_sumup+=temp_up;
hj(temp_sumup,temp_sumdown);
}
第四步:分子包含了符号,也就说,对于分子为正的数,进行整数化处理:
for(int i = ;i<times;i++)
{
scanf("%lld/%lld",&temp_up,&temp_down);
long long int temp = lcm(temp_sumdown,temp_down);
if(temp_sumdown<temp) temp_sumup*=(temp/temp_sumdown);
if(temp_down<temp) temp_up*=(temp/temp_down);
temp_sumdown = temp;
temp_sumup+=temp_up;
hj(temp_sumup,temp_sumdown);
}
第五步:对输入0进行单独处理,这里是我之前没想到的事情,一直test5出错,加了下面这句话之后就过了。
else if(temp_sumup == ) printf("0\n");
第六步:对分子为负数的情况进行符号处理:
else
{
temp_sumup*=-;
long long int intt = temp_sumup/temp_sumdown;
long long int up = temp_sumup - intt*temp_sumdown;
long long int down = temp_sumdown;
hj(up,down);
if(intt>)
{
printf("-%lld",intt);
if(up>) printf(" -%lld/%lld\n",up,down);
else printf("\n");
}
else printf("-%lld/%lld\n",temp_sumup,temp_sumdown);
}
· AC代码:
#include<stdio.h>
#include<math.h>
using namespace std;
long long int times,temp_up,temp_down;
long long int temp_sumup,temp_sumdown;
void hj(long long int &a,long long int &b)
{
long long int m,n,p;
m=a;n=b;p=m%n;
while(p!=)
{
m=n;n=p;
p=m%n;
}
if(n!=) //化为最简分式
{
a/=n;
b/=n;
}
if(b<) //处理分母为复数
{
a=-a;
b=-b;
}
}
long long gcd(long long m, long long n)
{
return (m==)?n:gcd(n%m, m);
}
long long lcm(long long a, long long b)
{
return a / gcd(a, b) * b;
}
int main()
{
scanf("%lld",×);
scanf("%lld/%lld",&temp_sumup,&temp_sumdown);
for(int i = ;i<times;i++)
{
scanf("%lld/%lld",&temp_up,&temp_down);
long long int temp = lcm(temp_sumdown,temp_down);
if(temp_sumdown<temp) temp_sumup*=(temp/temp_sumdown);
if(temp_down<temp) temp_up*=(temp/temp_down);
temp_sumdown = temp;
temp_sumup+=temp_up;
hj(temp_sumup,temp_sumdown);
}
if(temp_sumup >)
{
long long int intt = temp_sumup/temp_sumdown;
long long int up = temp_sumup - intt*temp_sumdown;
long long int down = temp_sumdown;
hj(up,down);
if(intt>)
{
printf("%lld",intt);
if(up>) printf(" %lld/%lld\n",up,down);
else printf("\n");
}
else printf("%lld/%lld\n",temp_sumup,temp_sumdown);
}
else if(temp_sumup == ) printf("0\n");
else
{
temp_sumup*=-;
long long int intt = temp_sumup/temp_sumdown;
long long int up = temp_sumup - intt*temp_sumdown;
long long int down = temp_sumdown;
hj(up,down);
if(intt>)
{
printf("-%lld",intt);
if(up>) printf(" -%lld/%lld\n",up,down);
else printf("\n");
}
else printf("-%lld/%lld\n",temp_sumup,temp_sumdown);
} return ;
}
·AC截图:

· 解后反思:
这里提到了三个模板需要熟记于心,一个是化简模板、一个是gcd、还有一个lcm模板,可能之后要经常用到~然后就是要时刻注意加减乘除四种运算是否会爆long long int的情况,以及对特殊情况的处理。
------------------------------------------------L1-010----------------------------------------------------------
比较大小
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
输出样例:
->->
------------------------------------------------L1-010----------------------------------------------------------
注解:水题,一个sort即可解。
#include<stdio.h>
#include<algorithm>
using namespace std;
int temp[];
int main()
{
scanf("%d %d %d",&temp[],&temp[],&temp[]);
sort(temp,temp+);
printf("%d->%d->%d\n",temp[],temp[],temp[]);
return ;
}
------------------------------------------------L1-011----------------------------------------------------------
A-B
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
------------------------------------------------L1-011----------------------------------------------------------
注解:这道题我WA了好一会,总感觉思路很正确没毛病,结果出错在输入的函数选择上:
#include<iostream>
#include<cstring>
using namespace std;
string a,b;
bool vis[];
int main()
{
getline(cin,a);
getline(cin,b);
for(int i=;i<b.length();i++) vis[b[i]+]=;
for(int i=;i<a.length();i++) if(vis[a[i]+] == ) cout<<a[i];
cout<<endl;
return ;
}
疑问:使用cin.getline对char数组输入是会WA的,至今不知道为什么,而使用getline(cin,string)对string类输入却能直接AC,希望有大神能够留言帮我解决这个问题~ 万分感谢。同时耶告诉我以后再这方面需要注意,对于空格和换行符的输入的时候,多使用几种输入方法,可能就能通过AC了~
注:如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~互相帮助互相鼓励才能成长鸭~~
『ACM C++』 PTA 天梯赛练习集L1 | 007-011的更多相关文章
- 『ACM C++』 PTA 天梯赛练习集L1 | 001-006
应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 052-053
今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 048-49
今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 040-41
近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 021-024
忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 044-45
记录今日刷题 ------------------------------------------------L1-044--------------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 042-43
记录刷题情况 ------------------------------------------------L1-042--------------------------------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 036-037
这几天比较忙,所以随便做做水题了,得赶紧把英剧搞完啊啊啊啊啊啊 ------------------------------------------------L1-036-------------- ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 029-033
哈哈,今天开始我也是学车人了~ 开始一千多道疯狂刷题~ ------------------------------------------------L1-029------------------ ...
随机推荐
- autocomplete 属性 清除input框输入存留历史值,防止下拉历史值显示
autocomplete 属性规定输入字段是否应该启用自动完成功能. 自动完成允许浏览器预测对字段的输入.当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在字段中填写的选项. 注释:aut ...
- sql中replace的用法
update 表名 set 字段名=REPLACE (字段名,'原来的值','要修改的值') 如:将tbl_user表的user_name字段中的大写的A替换成小写的a update tbl_stud ...
- JavaScript 访问对象属性和方法及区别
这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...
- 把连接中传的参数截取出来变成一个json对象
获取url function test() { var url=window.location.search; if(url.indexOf("?")!=-1) { var str ...
- 【One Day菜鸟到大鸟】MyBatis搭建环境
一.概述 MyBatis是一个持久化框架和Hiberante差不多.比起JDBC来说MyBatis封装了JDBC让我们能够面向对象开发.比起Hiberante来说卸下了Hiberante那种重 ...
- Unity --- 关节组件
一.简介 Unity提供了下面的关节组件:铰链关节(Hinge Joint).固定关节(Fixed Joint).弹簧关节(Spring Joint).角色关节(Character Joint).可配 ...
- Spring boot 使用WebAsyncTask处理异步任务
上文介绍了基于 @Async 注解的 异步调用编程,本文将继续引入 Spring Boot 的 WebAsyncTask 进行更灵活异步任务处理,包括 异步回调,超时处理 和 异常处理. 正文 1. ...
- GTX650Ti,GT610安装黑苹果之经验与步骤
安装这两个显卡的黑苹果都是10.9以上的版本,一个是10.9.2,一个是10.9.4,最后都完美.主板一个是Z77,一个是H61. 1. 开始安装完以后,显卡不工作,能够安全模式进去. 2. 删除Ap ...
- 第三次scrum作业!
1.小组成员 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 刘洋江 薛思汝 2.个人在小组第三次冲刺任务及其完成情况描述 根据小组讨论所分配任务,积极辅助组长以及各个成员,理清思路,编写代码,尽量在规定时间 ...
- 浅谈App原生开发、混合开发及HTML5开发的优劣
App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率.节省成本即利用了原生的开发技术还应用了HTML5开发技术,是原生和HTML5技术的混合应用.目前App的开发 ...