第一题
这个首先就是要找到数字n本身的所有因数,也就是直接从[1~ s q r t ( n ) sqrt(n) sqrt(n)]计算每个数字是否是它的因数,最后求和再比较就可以,此处需要注意的就是因数查找的一个上界,sqrt本身返回的是一个float类型变量f,我们需要计算的上界应该是不超过该f的最大整数,所以直接将f转为int,这样就可以获取小于等于f的最大整数了
#include <iostream>
using namespace std;
bool perfectNumber(int n)
{
int factor_sum=0;
for (int i=1;i<n;i++)
{
if (n%i==0) factor_sum+=i;
}
if (factor_sum==n) return true;
else return false;
}
int main()
{
int m,n;
cin>>m;
cin>>n;
bool flag=false;
for (int i=m;i<=n;i++)
{
if (perfectNumber(i))
{
cout<<i<<" ";
flag=true;
}
}
if (!flag) cout<<"-1";
}
第二题
递归计算一下即可,还是和之前的说法一样,这种可以用循环实现的计算可以不用递归,这里直接用递归的计算公式进行求解即可,想优化的同学可以先计算m!,再利用计算到的中间结果去计算n!(注意,阶乘是个非常容易溢出的操作,需要用longlong存储,喜欢刷题的同学最好也要注意下,比如和,积,阶乘这些变量都是很容易溢出的)
#include <iostream>
using namespace std;
long long n_fac(long long n)
{
long long rv=1;
for (int i=2;i<=n;i++) rv*=i;
return rv;
}
int main()
{
long long m,n;
cin>>n;
cin>>m;
cout<<n_fac(n)/(n_fac(m)*n_fac(n-m));
}
第三题
这个题目的思路没啥难度,通过递归方法编写完成即可
#include <iostream>
using namespace std;
void valid(int n)
{
while (1)
{
cout<<n<<" ";
if (n==1) return;
if (n%2==1) n=3*n+1;
else n=n/2;
}
}
int main()
{
int n;
cin>>n;
valid(n);
}
第四题
这个没啥太多难度,直接通过指针索引计算输入字符串中有多少个字符即可
#include <iostream>
using namespace std;
int CountDigit(int number,int digit)
{
int ocurr=0;
while(1)
{
if (number%10==digit) ocurr++;
number/=10;
if (number==0) break;
}
return ocurr;
}
int main()
{
int number,digit;
cin>>number>>digit;
cout<<CountDigit(number,digit);
}
第五题
这题本意实际上是弄一个专门针对空格的split函数,这个就直接参考这个博客即可C++ split函数
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string collapse_str(const char* s)
{
auto n=strlen(s);
int i=0,j=0;
char rv[80];
for (;i<n;i++)
{
if (s[i]==' ') continue;
rv[j++]=s[i];
}
rv[j]='\0';
return string(rv);
}
int main()
{
char str[80];
cin.getline(str,80);
cout<<collapse_str(str);
}