第一阶段考核第2
#include <stdio.h>int main()
{
long long i,j,num=600851475143,max;
int flag=1;
for(i=2;i<=num/2;i++)
{
flag=1;
if(i%2==0)
{
flag=0;
continue;
}
for(j=num/i;;j++)
{
flag=1;
if(j%2==0)
{
flag=0;
break;
}
if(flag&&num==i*j)
{
max=i;
if(j>max)
{
max=j;
}
break;
}
break;
}
}
printf("最大质因数为:%lld",max);
return 0;
}
代码哪里错了啊?我的思路是先判断因数是否为质数,如是质数,则比较两数大小,最后输出最大数。 如果我理解正确的话,你的实现思路是:
先依次求得所有质数i,然后用num/i得到另一个因子,接着判断i和另一因子j的大小,保留大的那个因子;
有几个问题,
1.求质数i的时候,只对2取余不对,比如9,通过你的程序判断是不是也会被判定为质数呢?
2.根据题目给的例子可以知道,质数因子是指相乘后能够得到那个合数。质数因子可能会有多个(两个及两个以上),而你的逻辑是默认质数因子只有两个,这肯定是有问题的。 本帖最后由 jhq999 于 2022-4-10 15:10 编辑
一个数的除了1之外最小的因数一定是质数
int main()
{
unsigned long long val=45,yinzi=2;
printf("输入一个数字:");
scanf_s("%llu",&val);
for (int i = yinzi; i < val/yinzi ;i++)
{
while(val%yinzi)//最小的因子一定是质数因子
{
yinzi++;
}
printf("%llu,",yinzi);
val/=yinzi;
while(!(val%yinzi))
{
val/=yinzi;
printf("%llu,",yinzi);
}
}
if(val>1)printf("%llu",val);
printf("最大因子:%llu",val>yinzi?val:yinzi);
return 0;
}
int main()
{
long long num=78,sum=1,i=2;//,a=i;
for (; i < num; i++)//分解因数
{
if(0==num%i)
{
num=num/i;
//if(a!=i)printf("%lld,",i),a=i;
printf("%lld×",i);
sum*=i;
//a=i;
i--;//一个数的因子的最小因子不小于这个数的最小因子
}
}
//if(a!=num)printf("%lld",num),a=i;
printf("%lld=%lld",num,sum*num);
return 0;
}
71×839×1471×6857=600851475143 本帖最后由 yzzc 于 2022-4-10 15:43 编辑
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int n, k;//n,用户输入的正整数;k,最小质数(素数)
printf("请输入一个正整数\n");
scanf("%d", &n);
printf("%d=", n);
for (k = 2; k <= n; k++)
while (n != k)
{
if (n % k == 0)
{
printf("%d*", k);
n /= k;
}
elsebreak;
}
printf("%d\n", n);
return 0;
}
分析:对n进行分解质因数,找一个最小质数(素数)k。
1.如果n>k,n也能被k整除,打印出k的值,n的值改为n/k
2.如果n不能被k整除,k++
3.如果n=k,说明分解质因数过程结束,打印输出即可。
页:
[1]