一.题目:
在命令行输入如下命令:
xcopy /s c:\ d:\,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:\
参数4: 字符串d:\
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
1.参数分隔符为空格
2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” “d:\”时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
测试样例:
输入:xcopy /s c:\ d:\
输出:
4
xcopy
/s
c:\
d:\
解题思路
先遍历一遍,把要分隔的参数个数统计出来,然后对每一个字符进行判断,如果它不是空格也不是双引号就输出,如果是空格但前面有双引号则输出,遇到后面的双引号和空格则换行。
代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
int count = 0;
for(int i = 0;i<s.size();i++)
{
if(s[i]==' ')
count++;
else if(s[i]=='"')
{
do
{
i++;
}while(s[i]!='"');
}
}
cout<<count+1<<endl;统计个数
bool flag = true;用来判断是哪一个双引号(是前还是后)
for(int i = 0;i<s.size();i++)
{
if(s[i]!=' '&&s[i]!='"')不是空格不是双引号输出
cout<<s[i];
else if(s[i]=='"'&&flag)遇到第一个双引号,更改flag的值
{
flag = false;
}
else if(s[i]==' '&&!flag)如果遇到了在双引号中的空格要输出
cout<<s[i];
else if(s[i]=='"'&&!flag)如果是第二个双引号,恢复flag的值,并换行
{
flag = true;
cout<<endl;
}
else if(s[i]==' ')如果是双引号外的空格换行
cout<<endl;
}
}
return 0;
}
二.题目
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
输入描述:
输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)
输出描述:
输出小易最少需要跳跃的步数,如果不能到达输出-1
测试样例:
输入: 4 24
输出: 5
解题思路:
将1 - M个石板看做一个结果数组step,每个step[i]储存着从起点到这一步最小的步
数,其中0为不能到达。
从起点开始对step进行遍历,先求i的所有约数(即从step[i]能走的步数),然后更新那几个能到达的位置的最小步数。如果不能到达则更新为此时位置的最小步数 + 1,如果是能到达的就更新为min(已记录的最小步数,此处的最小步数 + 1)),遍历一遍后得到结果
代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void GetCountCD(int n,vector<int>&v)求此时n的所有公约数,记录在数组中
{
for(int i = 2;i<=sqrt(n);i++)
{
if(n%i==0)
{
v.push_back(i);
if(n/i!=i)
v.push_back(n/i);
}
}
}
int Jump(int n,int m)
{
vector<int>step(m+1,0);
step[n] = 1;
for(int i = n;i<m;i++)
{
vector<int>v;
if(step[i]==0)
continue;
GetCountCD(i,v);
for(int j = 0;j<v.size();j++)
{
if((v[j]+i)<=m&&step[v[j]+i]!=0)
step[v[j]+i] = min(step[v[j]+i],step[i]+1);
else if((v[j]+i)<=m)
step[v[j]+i] = step[i]+1;
}
}
if(step[m]==0)
return -1;
else
return step[m]-1;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<Jump(n,m)<<endl;
return 0;
}