任意给定一个大于1的整数n,设计一个算法求出n的所有因数。 任意给定一个大于1的整数n,设计一个算法求出n的所有因数(n...
作者&投稿:一纪 (若有异议请与网页底部的电邮联系)
任意给定一个大于1得正整数n,设计一个算法求出n得所有因数。这题要怎么做?~
c语言代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int cmp (const void *aa,const void *bb) //比较函数
{
return *(int *)aa-*(int *)bb;
}
int main()
{
int x,n,i,top=0;
int num[10000];
scanf ("%d",&n);
for (x=1;x<=sqrt(n);++x)
{
if (n%x==0) {num[top++]=x;if (x!=(n/x))num[top++]=n/x;}
}
qsort(num,top,sizeof(num[0]),cmp);
for (i=0;i<top;++i)
printf ("%d ",num[i]);
printf ("\n");
return 0;
}
这个算法并不高效果,不过算10亿以内的整数n,肯定能不到1秒出解的
你好:
第一步:给定一个正整数n
第二步:依次以(2~n-1)的整数d为除数去除n,检查余数是否为0.
若是,则d是n的因数;若不是,则d不是n的因数
第三步:在n的因数中加入1和n
第四步:输出n的所有因数
人才啊,你说的算法是计算机程序上的算法?我只能给出C语言是怎么写的,方法就是让这个数和1--n之间的所有整数做除法求取余数若余数为0则将其存入一个数组,数组长度为n,采用动态数组麻烦一点,若不是则将除数加1之后继续下一次循环直至循环结束代码从略OVER
打酱油......
楼上的时间复杂度为还是比较高 为O(n) 其中很多遍历都是重复的 我这里的代码可以达到时间复杂度O(√n)
#include
void main()
{
int i;
int number;
printf("请输入一个大于1的正整数");
scanf("%d",&number);
for(i=2;i * i
追问:
看不懂。
追问:
数学题的规范解题步骤。
追问:
谢谢啦。
追答:
采纳个最佳答案呗~
评论
0
0
0
加载更多
18=2*3^2,因此所有因数为1,2,3,6,9,18。根据从m=1开始,用循环语句m=m+1和判断语句m<=n:?及n/m是否余数为0?自己设计算法吧
n的因数,设为x,可得n=kx,k为常数,明显,k也为n的因数。所以求n的因数,可以求枚举1到n^0.5的所有数,判断这个数是否能被n除尽,那么n/x必然也为n的因数,且除了x^2=n的特殊情况,其他的x和n/x都不相等。为了看起来舒服,可以排序一下。c语言代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int cmp (const void *aa,const void *bb) //比较函数
{
return *(int *)aa-*(int *)bb;
}
int main()
{
int x,n,i,top=0;
int num[10000];
scanf ("%d",&n);
for (x=1;x<=sqrt(n);++x)
{
if (n%x==0) {num[top++]=x;if (x!=(n/x))num[top++]=n/x;}
}
qsort(num,top,sizeof(num[0]),cmp);
for (i=0;i<top;++i)
printf ("%d ",num[i]);
printf ("\n");
return 0;
}
这个算法并不高效果,不过算10亿以内的整数n,肯定能不到1秒出解的
你好:
第一步:给定一个正整数n
第二步:依次以(2~n-1)的整数d为除数去除n,检查余数是否为0.
若是,则d是n的因数;若不是,则d不是n的因数
第三步:在n的因数中加入1和n
第四步:输出n的所有因数
人才啊,你说的算法是计算机程序上的算法?我只能给出C语言是怎么写的,方法就是让这个数和1--n之间的所有整数做除法求取余数若余数为0则将其存入一个数组,数组长度为n,采用动态数组麻烦一点,若不是则将除数加1之后继续下一次循环直至循环结束代码从略OVER
打酱油......