牛客网OJ题解--20210225
水仙花数
https://ac.nowcoder.com/acm/problem/14386
本系列记录翀翀😐痛苦的刷题日志,所有题目均来自于牛客网OJ题目,坚持刷题谈起来容易做起来难,希望我可以坚持下去,这里仍然分享一段励志文案:每个人都有梦想,然而有些人把梦想变成了现实,有些人的梦想依旧是梦想,只因为他们为梦想付出的努力程度不一样,他们坚持的时间不一样,最终才有这样的结果。
NC14386-水仙花数
题目链接
https://ac.nowcoder.com/acm/problem/14386
题目描述
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:
这道题请写出程序判断输入的数是否为水仙花数。首先输入正整数 n,表示需要判断的数的个数 (1<=n<=100)。随后每一行输入一个数 Ai,对于每次输入判断 Ai 是否为水仙花数。每次判断 Ai 输出判断结果:如果是,输出 yes;否则输出 no
测试样例
输入
3 111 153 222
输出
no yes no
说明
111不是水仙花数,输出no,153是水仙花数,输出yes,222不是水仙花数,输出no
解题思路
两个思路,一个是存为整型,然后不断地模10取最后一位即可,还有一种思路是存为字符串,这样我们可以直接调用size()函数获得幂数。但是这样最终比较时需要将整型结果转换为字符串。
解题代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
string num;
cin >> num;
int len = num.size();
int ans = 0;
for (int i = 0; i < len; i++)
{
ans = ans + pow(num[i] - '0', len);
//自己在本地vscode上测试153居然会输出No!
// cout << "pow:" << pow(num[i] - '0', len) << endl;
// cout << ans << endl;
}
string s = to_string(ans);
if (s == num)
cout << "yes" << endl;
else
cout << "no" << endl;
}
system("pause");
return 0;
} NC14399-素数判断
题目链接
https://ac.nowcoder.com/acm/problem/14399
题目描述
给出一个数x,判断它是否为素数,并输出所有它的素因子。第1行输入组数T,代表有T组数据。第2-T+1行输入一个数x。数据保证:2≤x≤109。每行输出两行,对应输入行的结果。第1行,如果x是素数,输出“isprime”(不含双引号),否则输出“noprime”(不含双引号)。第2行,输出x的素因子。
测试样例
输入
3 2 9 10
输出
isprime 2 noprime 3 noprime 2 5
解题思路
这里记录一下解题方法,是一个快速寻找质因子的方法。就是从2到根号x注意枚举除数,那么对于除数i满足x%i==0一定是质因子(注意必须是保证从小到大找),然后x不断除i直至不能整除,这样就可以保证下一个找到的因子一定还是质因子。
解题代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin >> T;
int x;
while (T--)
{
cin >> x;
bool flag = true;
vector<int> ans;
//i从2到根号x枚举检验
int n = sqrt(x);
for (int i = 2; i <= n; ++i)
{
//如果当前的最小i是因子,那么就一定是质因子
if (x % i == 0)
{
flag = false;
ans.push_back(i);
//关键步骤,循环除去i,这样保证下一个因子仍然是质因子
while (x % i == 0)
x /= i;
}
//退出代码,不要忘记
if (x == 1)
break;
}
if (flag)
{
cout << "isprime" << endl;
cout << x << endl;
}
else
{
cout << "noprime" << endl;
for (int i = 0; i < ans.size() - 1; ++i)
{
cout << ans[i] << " ";
}
cout << ans.back();
if (x != 1)
//注意最后一个质因子没有存到答案数组中
//比如10,那么i从2到根号10
//i无法检验到5,所以10/2=5最后一个质因子5还赋值在x上,未存储到答案数组中
cout << " " << x;
cout << endl;
}
}
system("pause");
return 0;
} 