pta天梯赛c语⾔答案,PTA-团体程序设计天梯赛-练习集(更新
中)
L1-002 打印沙漏 (20 分)
不算沙漏下⾯,上⾯部分随着⾏数增加,字符的总数依次是1,4,9,16…满⾜row2×2-1<=n,逆推得上半部分⾏数(算上
1)row=sqrt((n+1)/2),⾏最⼤字符数=2×row-1。剩下的for循环实现。
L1-003 个位数统计 (15 分)
⽤map和数组统计,可以直接char数组,和dodo那题字符类型的通⽤了(例如按字典序输出⼀⾏英⽂句⼦每个单词的出现个数)
ps:pta⽤不了gets,可以改⽤line
#include
using namespace std;
int main()
{
char a[1005];
mapmp;
int len=strlen(a);
for(int i=0;i
map::iterator it;
for(it=mp.begin();it!=mp.end();it++)
cout<first<second<
return 0;
}
L1-006 连续因⼦ (20 分)
看数据范围,暴⼒肯定不⾏,就⼀边2~sqrt(n)遍历试根⼀边求区间并更新起始点和最⼤区间长度。注意:1不算在序列内,所以要从2开始#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
ll n,len=0,st,maxx=0;
int main()
{
cin>>n;
for(ll i=2;i<=sqrt(n);i++)
{
ll x=n,xi=i,len=0;c++判断素数
while(x%xi==0)//⼀旦试根成功就求区间
{
x=x/xi;
xi++;
len++;
}
if(len>maxx) //必须是> 不能是>=
{ //因为要保证是最长的同时是最⼩序列,即st要最⼩
maxx=len;
st=i;
}
}
if(maxx==0) printf("1\n%lld",n); //考虑质数情况 序列即本⾝
else
{
cout<
for(int i=1;i<=maxx;i++)
{
if(i==1) printf("%lld",st);
else printf("*%lld",st);
st++;
}
}
return 0;
}
L1-009 N个数求和 (20 分)
因为没开ll⽩花了半个⼩时…⽼经典了。通分 —> 特判t==1 —> 特判和为0 —> 约分 —> 判断符号 —> 分离整数 —> 根据分离后结果处理输出形式。注意:如果和为负数 ,那么之后分离整数时整数和分⼦都要⾃带负号 。
#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
ll gcd(ll a,ll b)
return b?gcd(b,a%b):a;
}
struct Rational
{
ll n,d;
}num[105];
ll mod,fz,fm,zs;
int main()
{
ll t,fh=1;
cin>>t;
for(ll i=1;i<=t;i++) scanf("%lld/%lld",&num[i].n,&num[i].d);
if(t==1)
{
if(num[1].n==0)
{
printf("0");
return 0;
}
mod=gcd(abs(num[1].n),abs(num[1].d));
fz=num[1].n/mod;
fm=num[1].d/mod;
fh=fz/abs(fz);
if(abs(fz)>=fm)
{
fh?zs=fz/fm:zs=-fz/fm;
fz=fz%fm;
}
if(fz==0) printf("%lld",zs);
else abs(zs)?printf("%lld %lld/%lld",zs,fz,fm):printf("%lld/%lld",fz,fm); return 0;
}
for(ll i=1;i<=t-1;i++)
fm=num[i].d*num[i+1].d;
fz=num[i].n*num[i+1].d+num[i+1].n*num[i].d;
num[i+1].n=fz;
num[i+1].d=fm;
}
if(fz==0)
{
printf("0");
return 0;
}
mod=gcd(abs(fz),abs(fm));
fm/=mod;
fz/=mod;
fh=(fm/abs(fm))*(fz/abs(fz));
if(abs(fz)>=fm)
{
fh?zs=fz/fm:zs=-fz/fm;
fz=fh*abs(fz)%fm;
}
if(abs(fz)==0) printf("%lld",zs);
else abs(zs)?printf("%lld %lld/%lld",zs,fz,fm):printf("%lld/%lld",fz,fm);
return 0;
}
L1-017 到底有多⼆ (15 分)
遍历字符串。注意:倍数是初始值为1,负数则再乘1.5,要是还是偶数则再乘2.0,例如负偶数的倍数=1×1.5×2.0,负奇数的倍数
=1×1.5,正偶数的倍数=1×2.0
L1-025 正整数A+B (15 分)
有很多细节要注意,①读取 ②如果是数字还得要求在区间内 ③有⼀种很坑的情况,例如:【输⼊:1 1 1】【输出:1 + ? = ?】⽽不是【1 + 1 = 2】或【? + ? = ?】
我⾃⼰的代码很繁琐
#include
#define ll long long
using namespace std;
const int maxn=1e3+5;
char a[maxn],b[maxn],ch;
int t=1,aa=0,bb=0,flaga=1,flagb=1,x=0,y=0;;
bool judge(char ch)
{
if(ch>='0'&&ch<='9') return true;
else return false;
}
int main()
{
while(scanf("%c",&ch))
{
if(t==1)
{
if((aa==0&&(!judge(ch)||ch=='0'))||(!judge(ch)&&ch!=' ')) flaga=0; else if(flaga&&ch!=' ') a[aa++]=ch;
}
if(t==2)
{
if((bb==0&&!judge(ch))||(!judge(ch)&&ch!=' '&&ch!='\n')) flagb=0; else if(flagb&&ch!='\n') b[bb++]=ch;
}
if(ch==' ') t++;
if(ch=='\n') break;
}
if(t>2) flagb=0;
if(flaga==0) printf("? + ");
else
{
for(int i=0;i
if(x>=1&&x<=1000) printf("%s + ",a);
else
{
printf("? + ");
flaga=0;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。