C++学习笔记(PTA)(2)

接着上次的进度做PTA…

1006

题目要求换个格式输出小于1000整数,思路比较简单:将输入的整数按位拆开,再以每位数作为哨兵值输出B,S,1234…即可。
按位拆开

while(n)//n is the inputed number
{
  a.push_back(n%10);//vector a is used to reserve the digits of n
  n/=10;
}

例如输入234,会得到a[0]=4,a[1]=3,a[2]=2,再分别用a的元素做哨兵值。
但测试后发现问题,如果输入的不是三位数,那么关于百位十位的循环无法正常判断是否要执行,故此加一个判断位数的部分:

int dev=1;
 m=n;//Copy n cause n is still useful
while(m)
{
  dev*=10;
  m/=10;
}
  w=log10(dev);//w is the number of digits of n

1007

此题要求找出小于输入数字的所有素数对,思路是用for循环找出所有的素数存在一个向量里,再判断相邻元素差值为2的有几个。

找出素数:

for(int i=2;i<n;i++)
{
  flag=1;

for(int j=2;j<=pow(i,0.5)/*1/2 is wrong */;j++)
if(!(i%j)) { flag=0; break; }
if(flag) { prime.push_back(i); nb++;}
}

1008

这题的要求是按输入的数字m右移数组,按照小桃子的思路来,先把最右边m个数字copy到数组(向量)最前面,然后再删掉他们:

m=3
4 5 6 2 3
6 2 3 4 5 6 2 3
6 2 3 4 5
//n is the size of the vector
a.insert(a.begin() ,a.begin() +n-m,a.begin() +n);  
a.erase(a.begin()+n,a.begin()+n+m);

1009

这题的题目比较有意思:说反话,就是把输入的英文句子反着输出。例如:输入"never give up",输出"up give never"。我的思路是把输入的句子存入一个数组里,同时记下空格的位置。接着根据空格位置反着循环输出。(太抽象了?看看例子就明白了)
以"never give up"为例:

  1. 记下空格:
 char c;
 int n=0;
 
 vector<char>input;
 vector<int>position(1,0);
 while((c=getchar())!='\n')
 {
  n++;
  if(c==' ') position.push_back(n);
  input.push_back(c); 
 }
 position.push_back(n+1);

因为需要,所以在position的首末位分别添上0,n+1。则position的元素依次为:0,6,11,14.

  1. 打印
    接下来就好办了,用for循环依次输出input下标为11-12,6-9,0-4的元素,空格重新打印;(注意数组下标从0开始,所以6,11分别表示空格后一位字母)
    代码实现:
  for(int i=position.size()-1;i>0;i--)
 {
  for(int j=position[i-1];j<position[i]-1;j++)
  cout<<input[j];
  if (i!=1) cout<<' ';
 }

输出示例:
示例

1010

此题题目我认为是有个小小bug的:题目中说,0多项式表示为0 0,可样例中并没有打印出,所以我自己添了上去。另外还有一个细节要注意,就是常数(0次项)导数为0(即0多项式)。
代码实现:

  for(int i=0;i<n;i=i+2)
  {
  no[i]*=no[i+1];//no is the vector that reserves the numbers
  no[i+1]-=1;
  cout<<no[i]<<' ';
  if (no[i+1]!=-1)cout<<no[i+1];
  else cout<<0;
  if(i+1!=n-1) cout<<' ';
  }

另外从此题发现,原来写的输入代码可以存不止两位的数字,原本还因为要存3 位数修改了一下,后来发现不用(晕)

 char c;
 while((c=getchar())!='\n')
 {
   if(c==' ')
   {
    if(sign) no.push_back(-b); 
    else no.push_back(b); 
    flag=0;
    sign=0;
    n++;
   }
   
   else if(c=='-')
   sign=1;
   
   else 
   {
    if(!flag){ b=c-48; flag++; }
    else { b=b*10+c-48;}
   }
 }
 if(sign) no.push_back(-b);
 else no.push_back(b);

添加了输入负数的部分

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值