int main(void)
{
float num
int ture,ture2
int n=2
int i=0
int j,a[10]
while(scanf("%f",&num)==1)
{
n=2
i=0
if((int)num==num)
{
ture=(int)num
ture2=ture/2
while(n<=ture2)
{
if(ture%n==0)
{
ture = ture/n
if (i==0 || (i>0 && a[i-1]<n))
{
a[i++]=n
}
}
else
{
n++
}
}
if(i==0)
printf("%d是素数\n",ture)
else
{
for(j=0j<ij++)
printf("%d ",a[j])
printf("\n")
}
}
else
printf("小数\n")
getchar()
}
printf("非数字\n")
return 0
}
我觉得逻辑上有点问题,帮你改了一下
运行结果如下:
你是想求该数的约数的和,就是你的程序,但要{}去掉,如下scanf("%d",&q)
for(i=1i<=qi++)
{if(q%i==0)
sum=sum+i}
printf("%d",sum)
如想输出该数所以的约数和所有约数的和,程序如下:
scanf("%d",&q)
for(i=1i<=qi++)
{
if(q%i==0)
{
sum=sum+i
printf("%d",i)
}
}
printf("\n")
printf("%d",sum)
对于这个问题我们只需要暴力从2到根号n这个闭区间的所有整数就行了,如果能整除计数就加2,不过如果这个整数的平方就是输入的n则计数只能加1。最后不要忘记1和其自身。如果根号n不是一个整数,那么我们可以向下取整。算法的整体复杂度是根号n,这个算法的时间消耗与根号n成正比,不过可以确定的是n在32位的整型(或者无符号的整型)数据范围内时间消耗还是比较乐观的。参考代码(C语言实现):#include
<stdio.h>
#include
<math.h>
int
main(void)
{
int
i
int
n
int
m
int
num
scanf("%d",
&n)
num
=
0
m
=
sqrt(n)
for
(i=2
i<=m
++i)
{
if
(n
%
i
==
0)
{
num
+=
2
if
(i
*
i
==
n)
{
--num
}
}
}
/*自然数1应该只有一个因子才对*/
if
(n
!=
1)
{
num
+=
2
}
else
{
++num
}
printf("%d\n",
num)
return
0
}