C++除数使用循环进行编码
C++ divisors code with loops
我在代码强制上遇到了一个问题,称为除数。
我相信我已经解决了它,但它给了我一个时间限制超过的错误,所以我尽了最大努力使它更短,但仍然是相同的错误。
在这个问题上,我必须给出这个数应该有多少除数。
我的代码是:
#include <iostream>
using namespace std;
int main(){
long long t, x;
int res = 2;
cin >> t;
for (int j = 0; j < t; j++){
cin >> x;
for (int i = 2; i <= x / 2; i++){
if (x%i == 0){
res++;
}
}
cout << res << endl;
}
return 0;
}
示例输入应为:
3
12
7
36
输出应为:
6
2
9
您可以根据当前数字是奇数还是偶数,将内部循环(计算当前数字除数的循环)"拆分"为两种不同的情况:如果是奇数,则您只需要用奇数检查除法,从3开始。
无论如何,您可以通过只检查从2到floor(sqrt(x))
的数字来进一步优化内部循环。如果一个数字x
可被i
整除,那么它也将被x / i
整除,所以不检查从2到x / 2
的数字,只查看(int) sqrt(x)
(不一定需要强制转换sqrt
的结果,因为i
是int
)。
内部循环的代码可能如下所示:
for (int i = 2; i <= (int)sqrt(x); i++) {
if (x % i == 0)
res += 2;
}
首先您的代码:
#include<iostream>
using namespace std; // poluting namespace
int main(){
long long t, x; // <------- EVIL use int64_t if that is what you want.
int res = 2; // is never reset is that your intent?
// what if x == 1???
cin >> t;
for (int j = 0; j < t; j++){ // comparing an int32_t with an int64_t ...
cin >> x; // stream has seldom been accused of being fast but is not likely to be the problem.
for (int i = 2; i <= x / 2; i++){ // as already suggested stop at sqrt(x) or see below.
if (x%i == 0){ // % is a costly operation.
res++;
}
}
cout << res << endl; // search for endl considered dangerous. use 'n' instead.
}
return 0;
}
编辑:删除了错误的代码。
因此,您可以从中使用的是不要使用std::endl
,因为它在每次写入后都会刷新输出,而是使用'\n'。
我不认为您真的需要改进循环本身。你应该做的是利用数字的数学性质,特别是素数。你应该只循环到数字的平方根。(请参阅此问题:优化素数的计算)。
这是我使用平方根的代码版本:
#include <cmath>
#include <iostream>
using namespace std;
int main() {
long long inputs;
cin >> inputs;
for(long long j = 0 ; j < inputs ; ++j) {
int divisors = 2;
long long current, maxdiv;
cin >> current;
maxdiv = sqrt(current);
for(long long i = 2 ; i <= maxdiv ; ++i)
if(current % i == 0)
divisors += 2;
// If the square root is a divisor, we added one divisor too many above.
if(maxdiv * maxdiv == current)
--divisors;
cout << divisors << "n";
}
return 0;
}
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- 如何确定我已使用非编码文件到达 EOF?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃
- 连接循环准确的Systemc编码样式,具有未达到的编码样式
- 干净编码:如何从循环中的函数调用内部中断循环
- 使用数组函数和循环求解伪元编码|C
- 在我的switch语句完全执行之前,我的while循环进入第二次迭代,我用c ++编码
- 我需要使用嵌套的 while 循环打印一个正方形。我想我已经用正确的逻辑对其进行了编码,但它没有给我所需的输出
- 用c++函数中的汇编程序对循环进行编码
- 需要帮助编码迭代器的循环链表在c++
- C++除数使用循环进行编码