第一阶段测试题中的求解其最大质数因子是多少?
#include <stdio.h>#include <math.h>
int main()
{
long long i, j, k, l, num = 600851475143;
_Bool flag = 1;
for (i = 2, j = num/i; flag != 0; i++, j = num/i, flag = 1)
{
if (i * j == num)//这有什么作用啊
{
k = sqrt((double)j);
for (l = 2; l <= k; l++)
{
if (j % l == 0)
{
flag = 0;
break;
}
}
if (flag)
{
break;
}
}
}
printf("%lld\n", j);
return 0;
}
问题1.这个if(i*j==num)有什么作用啊?? 怎么感觉是多余的
问题2.我用的code block该如何执行小甲鱼说的操作
小甲鱼说的 ”另外由于数字比较大,需要 long long 以上整型才能存储,而 long long 是 C99 新增加的类型,所以在编译的时候应该加上 -std=c99,即告诉 GCC 使用 C99 标准进行编译。另外 math.h 头文件需要加上 -lm 才能正常编译”
gcc -std=c99 -lm test.c && ./a.out
麻烦各位大手子啦 本帖最后由 jackz007 于 2021-1-18 01:30 编辑
如果 i * j == num 了,不就说明 i 和 j 是 num 的因子吗,据此可以判定,num 肯定不是质数,这就是这个判断的作用和意义。可见,其作用非常关键,不可或缺!
小甲鱼说的情况适合 Linux 系统,在 Windows 下可以全部忽视,只是整型数必须要定义成 long long,这一点是必须的。
在 Windows 系统上, long long 在 scanf() 和 printf() 中对应的格式描述符是 "%I64d",这一点比较特别,一定要注意,否则,用 "%lld" 是绝对要出错的。
如果是在 Windows 下,程序正常编译就行,即便使用了 math 库,只需要包含 <math.h> 头文件,编译的时候,不需要使用 -lm 选项。 jackz007 发表于 2021-1-17 23:38
如果 i * j == num 了,不就说明 i 和 j 是 num 的因子吗,据此可以判定,num 肯定不是质数,这就是 ...
原问题是2. 编写一个程序,求解 600851475143 的最大质数因子是多少?
“不就说明 i 和 j 是 num 的因子吗,据此可以判定,num 肯定不是质数”
num不就是这个600851475143吗
你的意思是需要一个if判断来验证题目给出的数是不是质数?
我想问下,这个long long有整数的意思吗?
我的想法是
这个if是确保i和j都是整数的情况下,相乘得出来的数还是num并不会因为整型的原因而改变
因为J=NUM/i 如果不能整除会强型变成整数 例如(j=5/2=2 结果j*2=4 <5)
纯属猜测,麻烦大手子解答{:10_254:} zhangfeiwen 发表于 2021-1-18 11:41
原问题是2. 编写一个程序,求解 600851475143 的最大质数因子是多少?
“不就说明 i 和 j 是 num 的因子 ...
if (i * j == num)
这一句的意思是,如果 i 和 j 是 num 的因子,就进入 if 语句块,进一步判断 j 是否是一个质数。
jackz007 发表于 2021-1-18 12:01
这一句的意思是,如果 i 和 j 是 num 的因子,就进入 if 语句块,进一步判断 j 是否是一个质数 ...
想明白了 谢谢 {:10_256:}
页:
[1]