真的是忙头晕了,学业、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",&times);
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。两字符串的长度都不超过10​4​​,并且保证每个字符串都是由可见的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的更多相关文章

  1. 『ACM C++』 PTA 天梯赛练习集L1 | 001-006

    应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...

  2. 『ACM C++』 PTA 天梯赛练习集L1 | 052-053

    今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...

  3. 『ACM C++』 PTA 天梯赛练习集L1 | 048-49

    今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...

  4. 『ACM C++』 PTA 天梯赛练习集L1 | 040-41

    近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...

  5. 『ACM C++』 PTA 天梯赛练习集L1 | 021-024

    忙疯警告,这两天可能进度很慢,下午打了一下午训练赛,训练赛的题我就不拿过来的,pta就做了一点点,明天又是满课的一天,所以进度很慢啦~ -------------------------------- ...

  6. 『ACM C++』 PTA 天梯赛练习集L1 | 044-45

    记录今日刷题 ------------------------------------------------L1-044--------------------------------------- ...

  7. 『ACM C++』 PTA 天梯赛练习集L1 | 042-43

    记录刷题情况 ------------------------------------------------L1-042--------------------------------------- ...

  8. 『ACM C++』 PTA 天梯赛练习集L1 | 036-037

    这几天比较忙,所以随便做做水题了,得赶紧把英剧搞完啊啊啊啊啊啊 ------------------------------------------------L1-036-------------- ...

  9. 『ACM C++』 PTA 天梯赛练习集L1 | 029-033

    哈哈,今天开始我也是学车人了~ 开始一千多道疯狂刷题~ ------------------------------------------------L1-029------------------ ...

随机推荐

  1. JSON对象的两个方法

    JSON对象有两个方法,stringify()和parse(). 最简单的方法,这两个方法分别用于吧JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值. ...

  2. 软件项目技术点(7)——在canvas上绘制自定义图形

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...

  3. JavaWeb请求-响应学习笔记

    先来看一个流程图: 服务器处理请求的流程: (1)服务器每次收到请求时,都会为这个请求开辟一个新的线程.   (2)服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载 ...

  4. sqlserver2008 insert语句性能

    在sqlserver2008中“新建查询”,执行批量添加语句的执行时间: declare @i int ) begin INSERT INTO [xxx].[dbo].[北京万奇亚讯科技_QueryL ...

  5. GIT团队合作探讨之二--Pull Request

    pull request是github/bitbucket给开发人员实现便利合作提供的一个feature.他们提供一个用户友好的web界面在进代码之前来讨论这些变更. 简单说,pull request ...

  6. Eclipse编码格式

    来源:http://e-ant.javaeye.com/blog/177579 如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,E ...

  7. DataS-2

    2.4 证明对任意常数k,(称此式为公式A) 证明: ①当k1<k2时,,因此只需证明正数对公式A成立: ②当k=0或1时,显然有和满足公式A: ③假设k<i (i>1)时,都满足公 ...

  8. pyqt5加载网页的简单使用

    如下初步使用了pyqt5,构造了一个webview来加载网址,呈现网页. 1.安装pyqt5包,可使用douban的源 pip install pyqt5 -i http://pypi.douban. ...

  9. July 03rd 2017 Week 27th Monday

    Even if you are on the right track, you will get run over if you just sit there. 即使你处于正确的轨道上,但如果你只是坐 ...

  10. some language grammars

    ANSI C grammar Python grammar 怎么识别LL(1) LR(0) SLR(1) 等文法,一个不错的解答. http://stackoverflow.com/questions ...