将 pascal 代码改写为 c++,使其尽可能高效地工作

Rephrase pascal code to c++ so it can work as efficient as possible

所以我得到了这个任务,我有 pascal 代码,我需要弄清楚结果是什么。这不是问题,因为我知道 pascal,但我需要它在 1 秒或更短时间内达到 运行,数字最大为 10^9。

readln(N);
counter:=0;
for i:=N-1 downto 1 do begin
    counter:= counter + 1;
    if N mod i = 0 then break;
end;
writeln(counter);

这是我的代码

#include <iostream>

using namespace std;

int main()
{
    int x;
    int counter = 0;
    cin>>x;
    for (int i = 2; i <= x; i++){
        if (x % i == 0){
            counter = x - x / i;
            break;
        }
    }
    cout<<counter;
    return 0;
}

但还是没法满分

10^9这样的数字通常表示竞赛题,需要创造性思维而不是快速CPU...

看,N mod i = 0 表示 N 可以被 i 整除。所以循环计算 N 和它的一个除数之间的数字(可能加一......检查它。)哪个 - 留给你。

重述问题:
1) 计算 F = X 的最大固有因数
2) 输出 X-F

不要直接搜索最大的适当因子,而是应用三个简单的优化(可能需要更高级的东西,但首先看看三个简单的优化是否足够)。

A) 求 S = X 大于 1 的最小因数。输出 X-(X/S)
B) 素数的特例
C) 偶数

的特例
int largest_proper_factor(int X)
{
   if ( X % 2 == 0 ) return X/2;  // Optimize even

   // Note the add of .5 is only needed for non compliant sqrt version that
   // might return a tiny fraction less than the exact answer.
   int last = (int)(.5 + std::sqrt( (double) X )) );

   for ( int i=3; i<=last; i+=2 ) // big savings here because even was optimized earlier
   {
      if ( X % i == 0 ) return X/i;
   }
   return 1;  // special case for prime
}

好的,我得到了我想要的结果:

#include <iostream>
using namespace std;
int main()
{
    int x;
    int counter = 0;
    cin>>x;
    for (int i = 2; i <= x; i++){
        if (x % i == 0){
            counter = x - x / i;
            break;
        }
        if (x / 4 == i){
            i = x - 1;
        }
    }
    cout<<counter;
    return 0;
}

感谢所有帮助过我的人:)