1.
相亲数
在数学中,若彼此的约数之和(除去自身)等于另一方,则二者被称为亲和数。
例如:
220的约数和为1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
284的约数和为1 + 2 + 4 + 71 + 142 = 220
则220和284为一对亲和数。
输出10000以内的亲和数。
输出样例:
220 284
1184 1210
2620 2924
5020 5564
6232 6368
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
bool st[N];
int get_divsum(int n)
{
int sum = 1;//必有1为了不加自己这个特判
for (int i = 2 ; i <= n / i ; i ++)
{
if (n % i == 0)
{
sum += i ;
if (n / i != i) sum += n / i;
}
}
return sum ;
}
int main()
{
for (int i = 1 ; i <= 10000 ; i ++)
{
if (!st[i])
{
st[i] = true;
int x = get_divsum(i);
if (i == get_divsum(x) && i != x)
{
st[x] = true;
cout << i << ' ' << x << endl;
}
}
}
return 0;
}
2.
异位字符串
给定两个字符串𝑠和𝑡,𝑠和𝑡的长度n最大是1000,判断𝑠和𝑡是否为字母异位词(相同字母的数量是否相等),大小写敏感,不含非字母字符串,且时间复杂度要求在 𝑂(𝑛),除了输入输出以外不能用字符串相关的函数,如果是则输出true,不是输出false
输入样例:
anagram
nagaram
输出样例:
true
#include <bits/stdc++.h>
using namespace std;
unordered_map<char,int> h;
int main()
{
for (int i = 0 ; i < 2 ; i ++)
{
string str ;
cin >> str ;
for (int j = 0 ; j < str.size() ; j ++)
if (isalpha(str[j]))
{
if (i == 0) h[str[j]] ++;
else h[str[j]] --;
}
}
for (auto [v , c] : h )
{
if (c != 0)
{
puts("false");
return 0;
}
}
puts("true");
return 0;
}