一、跳石板
1.描述
2. 代码实现
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
//求约数
void get_y(int n,vector<int>& y)
{
for(int i=2;i<=sqrt(n);++i)
{
if(n%i==0)
{
y.push_back(i);
if(n/i!=i)
y.push_back(n/i);
}
}
}
//求步数
int get_step(int n,int m)
{
vector<int> min_step(m,0);
//起始步数设为1,是为了一开始不执行if(min_step[i]==0)这个语句
//起始就为0,一直跳过循环,就无法进行下边的判断了。
min_step[n]=1;
for(int i=n;i<m;++i)
{
vector<int> y;
//此步作用:
//比如从第四个石板已经跳到第6块石板了,
//则下一步就从第6块接着跳,就不用在算第五步的约数和和跳法了。
if(min_step[i]==0)
continue;
//求约数
get_y(i,y);
for(int j=0;j<y.size();++j)
{
//如果该步数在之前都到达过,则取最小的那一步
if(i+y[j]<=m&&min_step[i+y[j]]!=0)
min_step[i+y[j]]=min(min_step[i+y[j]],min_step[i]+1);
//第一次到达该石板,则步数为上一个石板步数加1
else if(i+y[j]<=m)
min_step[i+y[j]]=min_step[i]+1;
}
}
if(min_step[m]==0)
return -1;
//起始多加了1次,最后在减1次
return min_step[m]-1;
}
int main()
{
int N,M;
while(cin>>N>>M)
{
cout<<get_step(N,M)<<endl;
}
return 0;
}
二、最难问题
1.描述
【解题思路】:密码 > ‘E’ 则:原文= 密码 - 5 否则: 原文 = 密码 +21
2.代码实现
#include<stdio.h>
int main()
{
char c;
while((c=getchar())!=EOF)
{
if(c>='A'&&c<='Z')
{
if(c>'E')
c-=5;
else
c+=21;
}
putchar(c);
}
return 0;
}
三、求因子个数
1.描述
【解题思路】从最小因子2到数字的最大因子数(数字的平方根)开始判断是否能够取余可以则循环取余直到取余不为0,因子个数+1;否则使用下一个因子计算;最终整除了各个因子数之后剩余的数字不为1则本身也是一个因子,因此因子数+1。
2.代码实现
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int count=0;
for(int i=2;i<sqrt(n);++i)
{
if(n%i==0)
{
while(n%i==0)
{
n/=i;
}
count++;
}
}
if(n!=1)
count++;
cout<<count<<endl;
}
return 0;
}