B 小红的因子数
https://ac.nowcoder.com/acm/contest/74362/B
题目所求为素因子的数,素数是除了1和本身之外没有其他的因数。所以用遍历的方法,从2开始遍历。
有人会说,例如12,除以4也是等于0.但4=2*2。
这就想起一条结论,不是素数的数都可以被分成素数相乘。
这题最后还要加个特殊判断,就是x没有被除尽,说明最后的数也是素数
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long x;
long long sum=0;
cin>>x;
for(long long i=2;i*i<=x;i++)
{
if(x%i==0)
{
sum++;
while(x%i==0) x/=i;
}
}
if(x>1) sum++;
cout<<sum<<endl;
return 0;
}
C 小红的字符串中值
https://ac.nowcoder.com/acm/contest/74362/C
这题最主要的思路就是,找到要找字符的位置看它前后字符大小的最小值。
解释一下为什么这么做,由题意我们可以知道单独的一个字符算一个,然后以这个字符为中心。如果两边都有1个,那这个子字符串的长度就变成了3,但中间还是要找的字符,这也算上一个
画个图吧,语言宕机了。

以b为中心向两边散,我们可以知道要想符合条件就只有1这个长度,也就是最小值。如果那个2变成3,1变成2.也就加2.因为1的时候是3个字符,2的时候是5个字符,这样总和就是加了2。
这题还有个小点,n的范围最大为10^5,但字串的个数有n(n+1)/2+1,这样会超int范围,所以要使用long long。
所以代码如下
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
long long sum=0;
int n;
char c;
cin>>n>>c;
cin>>s;
for(int i=0;i<n;i++)
{
if(c==s[i])
{
sum++;
sum+=min(i,n-1-i);
}
}
cout<<sum<<endl;
return 0;
}
浙公网安备 33010602011771号