# 45 条题解

• @ 2017-08-25 01:52:12

so water，我时间效率高

``````#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
long long a,b,c,d,e,f,g,n,i,j;
scanf("%lld",&n);
for(i=3;i<=n;i=i+2)
{
a=i;
if(n%2==0)
{
a=2;
break;
}
if(n%3==0)
{
a=3;
break;
}
if(n%a==0)
break;
}
printf("%lld",n/a);
return 0;
}
``````
• @ 2016-11-27 19:57:11
``````评测结果
编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 512 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 508 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 508 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 512 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 512 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 508 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 508 KiB, score = 10
测试数据 #7: Accepted, time = 0 ms, mem = 508 KiB, score = 10
测试数据 #8: Accepted, time = 0 ms, mem = 504 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 504 KiB, score = 10
Accepted, time = 0 ms, mem = 512 KiB, score = 100
代码
#include <cstdio>
int main() {
int n;
scanf("%d",&n);
for (int i = 2;i*i <= n;i++)
if (!(n%i)) {
printf("%d",n/i);
return 0;
}
}
``````
• @ 2016-11-06 16:51:56

#include<stdio.h>

int main()
{
long long n,i;
scanf("%lld",&n);
for(i=2;i<=n/2;i++)
if(n%i==0)
{
printf("%lld\n",n/i);
return 0;
}
}

• @ 2016-02-10 21:11:53

第二个数据(也就是测试数据#1）是错的！！！！！！！！！！！！！

#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

long long n,i,temp1,temp2,flag1;

int main()
{
temp1=1;
temp2=1;
cin>>n;
flag1=trunc(sqrt(n));

for (i=2;i<=flag1;i++)
{
if (n%i==0)
{
temp1=i;
break;
}
}

for (i=2;i<=flag1;i++)
{
if (n%i==0)
{
temp2=i;
//break;
}
}
//我发现有break就可以AC，没有第二个数据就过不去 于是验证一下 第二个数据不合格

if( (temp1<temp2)&&(temp2<n/temp2)&&(n/temp2 < n/temp1) )
{cout<<n/temp1;}
else{cout<<temp1+28;} //这句是为了让别的9个数据WA

return 0;
}

编译成功

测试数据 #0: WrongAnswer, time = 0 ms, mem = 556 KiB, score = 0
测试数据 #1: Accepted, time = 0 ms, mem = 560 KiB, score = 10
测试数据 #2: WrongAnswer, time = 0 ms, mem = 564 KiB, score = 0
测试数据 #3: WrongAnswer, time = 0 ms, mem = 560 KiB, score = 0
测试数据 #4: WrongAnswer, time = 0 ms, mem = 560 KiB, score = 0
测试数据 #5: WrongAnswer, time = 0 ms, mem = 556 KiB, score = 0
测试数据 #6: WrongAnswer, time = 0 ms, mem = 560 KiB, score = 0
测试数据 #7: WrongAnswer, time = 0 ms, mem = 560 KiB, score = 0
测试数据 #8: WrongAnswer, time = 0 ms, mem = 556 KiB, score = 0
测试数据 #9: WrongAnswer, time = 0 ms, mem = 560 KiB, score = 0
WrongAnswer, time = 0 ms, mem = 564 KiB, score = 10

这就说明(temp1<temp2)&&(temp2<n/temp2)&&(n/temp2 < n/temp1) 为ture
也就是说这个数据至少有 4个因数！！！！

真特么坑比

• @ 2015-12-14 04:52:10

#include<stdio.h>
int main()
{
unsigned long n,i;
scanf("%lu",&n);
for(i=2;i<=n/2;i++)
if(n%i==0)
{
printf("%lu",n/i);
return 0;
}
}
晕，一开始想复杂了，没想到是简单题……&

• @ 2015-12-13 15:34:06

var
i,j:longint;
begin
for i:=(j div 2 ) downto 2 do
if j mod i=0 then
begin
writeln(i);
break
end;
end.

• @ 2015-12-20 14:55:38

include<stdio.h>

int main()
{
unsigned long n,i;
scanf("%lu",&n);
for(i=2;i<=n/2;i++)
if(n%i==0)
{
printf("%lu",n/i);
return 0;
}
}

• @ 2016-03-04 21:20:48

666

• @ 2015-10-31 10:33:31

var
i,m,s:longint;
begin
for i:=2 to s-1 do
if s mod i =0 then m:=i;
writeln(m);
end.

• @ 2015-10-24 16:26:38

double

• @ 2015-10-23 08:32:42

Var n,i:longint;
Begin
for i:=2 to n do
if (n mod i)=0 then begin
writeln(n div i); exit;end;
end.

• @ 2015-09-26 18:15:03

#include <iostream>
using namespace std;

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

• @ 2015-09-13 17:04:41

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int pd(int x)
{
int i;
for(i=2;i<=sqrt(x);i++){
if(x%2==0){
return 0;
}
}
return 1;
}
int search(int x)
{
int i;
for(i=2;i<=sqrt(x);i++){
if(pd(i)&&pd(x/i)&&x%i==0){
return x/i;
}
}
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",search(n));
return 0;
}

• @ 2015-08-17 09:12:13

Mr.czh是大神，有什么问题找他

• @ 2015-08-24 14:53:23

hhhhhhh

• @ 2015-07-18 14:21:10

#include<cstdio>
#include<cmath>
using namespace std;
int tf(int x)
{
if(x<2)return 0;
int t=(sqrt(double(x+1)));
for(int i=2;i<=t;i++)
if(x%i==0)return x/i;
}
int main()
{
int n,i,j,m;
scanf("%d",&n);
printf("%d\n",tf(n));
return 0;
}

• @ 2015-07-18 14:21:32

李玄j

• @ 2015-02-23 12:47:54

编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 280 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 276 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 280 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 280 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 280 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 276 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 280 KiB, score = 10
测试数据 #7: Accepted, time = 0 ms, mem = 276 KiB, score = 10
测试数据 #8: Accepted, time = 0 ms, mem = 280 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 276 KiB, score = 10
Accepted, time = 0 ms, mem = 280 KiB, score = 100
代码
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=n-2; i>=2; i=i-2){
if(n%i==0){
cout<<i<<endl;
break;
}
}
}

• @ 2015-02-10 10:58:58

首先，我竟然傻傻的打表了，这叫求质数的线性筛法。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;

int prime[25000];
int psize;
void init(){
bool a[50000];
memset(a, -1, sizeof(a));
int i, j;
psize = 0;
for (i = 2; i < 50000; i++){
if (a[i]){
prime[psize++] = i;

}
for (j = 0; j < psize&&prime[j]*i<50000; j++){
a[prime[j] * i] = false;
if (i%prime[j] == 0)break;
}
}
}
int main(){
freopen("in.txt", "r", stdin);
long long int n;
cin >> n;
init();
int i;
for (i = 0; i < psize; i++){
if (n%prime[i] == 0){
cout << n / prime[i] << endl;
break;
}
}
return 0;
}

• @ 2014-12-18 17:15:30

让我作一个全面的题解：
顺便让小白的我也总结下，虽然题目比较简单，但是还是要认真对待啊~

首先，我们一看到题目，很容易想到枚举，:
1：输入一个n，从2开始到N枚举，找到其（因数）然后用过程从2到N去mod，判断其是不是素数，就得到了思路最简单，但是却最笨的办法。

2：优化，知道素数性质的不难明白，最大的素因数顶多是 N div 2 ，因此减少了一半的循环次数。

3：虽然这样做已经很好了，但是如果你懂得一些数学知识，很容易找到一种超简便的办法（这就是下面为毛他们题解没有判断素数的过程）

首先分解因数，只要因数有不是素数的，我们就会再对该因数分解，总之，无论如何，最后分解完一定是一堆素数的乘积。

题目上说，这个数是素数A和素数B的乘积。
那不就结了？已经是2个素数的乘积了，你还要分解么？
所以这个数一定只有4个因数 1，A , B, 已经它自己
所以从2开始枚举到N div 2，找到A就可以找到B

为了程序更加效率，因为要找最大的，不妨贪心一下，咱们从大的开始downto下来。
于是得到了最简单的程序。
###block code
program ex;
var n,num,i,ans:longint;
begin
for i:=(n div 2) downto 2 do
begin
if n mod i=0 then
begin
ans:=i;
break;
end;
end;
write(ans);
end.

• @ 2014-12-18 17:19:19

例如 3*8=24,8不是素数，我们还需要分解，最后是2*3*2*2=28，一直到全素数，所有的因数无非是这些素因数的组合得到的，比如6是24的因数，无非是2*3得到的，无论哪个不是素数的因数，这个数的素因数的乘积肯定得到的。

但是N=A*B已经是2个素数了，A B再怎么组合也只能乘出一个N，所以只有A,B2个因数，而且都是素因数。

• @ 2014-12-14 18:25:40

评测状态 Accepted
题目 P1773 质因数
递交时间 2014-12-14 18:24:24
代码语言 Pascal
评测机 上海红茶馆
消耗时间 6 ms
消耗内存 816 KiB
评测时间 2014-12-14 18:24:25

评测结果
编译成功

测试数据 #0: Accepted, time = 0 ms, mem = 816 KiB, score = 10

测试数据 #1: Accepted, time = 0 ms, mem = 816 KiB, score = 10

测试数据 #2: Accepted, time = 0 ms, mem = 812 KiB, score = 10

测试数据 #3: Accepted, time = 3 ms, mem = 816 KiB, score = 10

测试数据 #4: Accepted, time = 3 ms, mem = 816 KiB, score = 10

测试数据 #5: Accepted, time = 0 ms, mem = 816 KiB, score = 10

测试数据 #6: Accepted, time = 0 ms, mem = 816 KiB, score = 10

测试数据 #7: Accepted, time = 0 ms, mem = 816 KiB, score = 10

测试数据 #8: Accepted, time = 0 ms, mem = 812 KiB, score = 10

测试数据 #9: Accepted, time = 0 ms, mem = 816 KiB, score = 10

Accepted, time = 6 ms, mem = 816 KiB, score = 100

代码
var q,n,p,i:longint;
begin
for i:=2 to n div 2 do
if n mod i=0 then
begin
q:=i;
break;
end;
p:=n div q;
writeln(p);
end.

• @ 2014-10-28 18:43:38

弱弱AC
var a,b,c,i:longint;
begin
for i:=2 to a do
if a mod i=0 then begin
b:=i;
break;
end;
c:=a div b;
writeln(c);
end.

• @ 2014-10-28 18:43:15

var a,b,c,i:longint;
begin
for i:=2 to a do
if a mod i=0 then begin
b:=i;
break;
end;
c:=a div b;
writeln(c);
end.

• @ 2014-10-13 16:24:09

因为数字为质因数乘积，所以除了本身和1只有两个因数，程序如下
var n,i:longint;
begin
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then begin write(n div i);halt;end;
end.

ID
1773

3

(无)

(无)

2131

1042

49%

3