接着上次的进度做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到数组(向量)最前面,然后再删掉他们:
//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"为例:
- 记下空格:
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.
- 打印
接下来就好办了,用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);
添加了输入负数的部分
(完)