#include<iostream>
using namespace std;
int main()
{
int a, cnt = 0;
cin >> a;
for (int i = 1; i <= a; i++)
{
if (a % i == 0)
{
cnt++;
}
}
cout << cnt;
return 0;
}
例题中,cnt 变量起到了标记作用,用于标记有多少个 a 的因数。 在遇到 a 很大时,代码的效率很低。
上述错误只有当 a 是完全平方数时才会出现,如果 a 是完全平方数,那么 cnt 最 后减 1 即可。
关于判断 a 是完全平方数,可以先令 int b=sqrt(a),如果 b 的平方是 a,说明 sqrt(a)的值是 整数,也就是说 a 是完全平方数。
例如
a=25,那么 b=sqrt(a)=5,5 的平方是 25,所以 25 是完全平方数;
如果
a=24,那么 b=sqrt(a)=4,4 的平方不是 24,所以 24 不是完全平方数。
优化后的代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a, cnt = 0;
cin >> a;
for (int i = 1; i <= sqrt(a); i++)
{
if (a % i == 0)
{
cnt += 2;
}
}
int b = (int)sqrt(a);
if (b * b == a)
{
cnt--;
}
cout << cnt;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a;
cin >> a;
bool b[6];
for (int i = 1; i <= 5; i++)
{b[i] = false;}
while (a > 0)
{
int c = a % 10;
if (c >= 1 && c <= 5){b[c] = true;}
a = a / 10;
}
bool f = true;
for (int i = 1; i <= 5; i++)
{
if (b[i] == false)
{
f = false;
break;
}
}
if (f){cout << "Yes";}
else{cout << "No";}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a, b, c, d, n, cnt = 1;
cin >> a >> b >> c >> d >> n;
int stat[100] = { 0 };
while (stat[a] == 0)
{
stat[a] = cnt;
cnt++;
a = (a * b + c) % d;
}
//说明从第 1 项到
//第 stat[a]-1 项是前导的不循环部分
//从第 stat[a]项到
//第 cnt-1 项是一个完整的循环节
if (n >= stat[a])
{//计算第 n 项相当于第几项
n = (n - stat[a]) % (cnt - stat[a]) + stat[a];
}
for (int i = 0; i < d; i++)
{
if (stat[i] == n)
{
cout << i;
break;
}
}
return 0;
}
4、使用二进制位记录多件事是否发生过 这题没懂
【例 3】输入 m 个整数(m<=1e+6),问 0 到 9999 之间有多少个数字至少出现过一次。(假 设这题限制内存)