c语言★数据输入 输入一行包括一个正整数 n(1<=n<=10^12)。 ★数据输出 输出仅有一个数,为 n 的约数个数
答案:2 悬赏:10 手机版
解决时间 2021-03-25 17:17
- 提问者网友:泪痣哥哥
- 2021-03-25 10:15
c语言★数据输入 输入一行包括一个正整数 n(1<=n<=10^12)。 ★数据输出 输出仅有一个数,为 n 的约数个数
最佳答案
- 五星知识达人网友:杯酒困英雄
- 2021-03-25 11:40
#include
#include
#include
int main()
{
__int64 n,i;
int sum=1,num=0;
scanf("%I64d",&n);
printf("%I64d=",n);
while(n%2==0)
{
printf("%d*",2);
num++;
n/=2;
}
sum*=(num+1);
num=0;
for(i=3;i<=sqrt(n)||(i<=n);)
{
if(n%i==0)
{
n/=i;
printf("%I64d*",i);
num++;
continue;
}
sum*=(num+1);
num=0;
i+=2;
}
sum*=(num+1);
printf("%I64d
",n);
printf("约数个数为:%d
",sum);
return 0;
}
今天是涨姿势了,看了好多东西,终于做出来了。根据你的上的需求,不能使用楼上的挨个遍历并计数的方法(我测了10的12次方情况,2分钟还不能结束),只能用快速求约数方法,本题的钥匙在于:
把这个数先用2、3、5、7、11、13、......等质数的连乘积表示,比如
24=2*2*2*3=2³*3
再用各个质数的指数加一后再相乘即为此数的约数个数,2的质数为3,3的指数为1。
比如 (3+1)*(1+1)=4*2=8, 即表示24有8个约数。
如上面例子,也就是要求分解式子,然后统计每个因子的指数,实现+1后相乘,sum中就是结果,算法采用快速计算方法,每次都会把范围缩小到n/i然后开平方。
追问测试有一个超时了...
大神能不能再优化一下
能不能顺便解决一下这道题
zhi●dao.bai●du.co●m/question/1175183927105812419.html
#include
#include
int main()
{
__int64 n,i;
int sum=1,num=0;
scanf("%I64d",&n);
printf("%I64d=",n);
while(n%2==0)
{
printf("%d*",2);
num++;
n/=2;
}
sum*=(num+1);
num=0;
for(i=3;i<=sqrt(n)||(i<=n);)
{
if(n%i==0)
{
n/=i;
printf("%I64d*",i);
num++;
continue;
}
sum*=(num+1);
num=0;
i+=2;
}
sum*=(num+1);
printf("%I64d
",n);
printf("约数个数为:%d
",sum);
return 0;
}
今天是涨姿势了,看了好多东西,终于做出来了。根据你的上的需求,不能使用楼上的挨个遍历并计数的方法(我测了10的12次方情况,2分钟还不能结束),只能用快速求约数方法,本题的钥匙在于:
把这个数先用2、3、5、7、11、13、......等质数的连乘积表示,比如
24=2*2*2*3=2³*3
再用各个质数的指数加一后再相乘即为此数的约数个数,2的质数为3,3的指数为1。
比如 (3+1)*(1+1)=4*2=8, 即表示24有8个约数。
如上面例子,也就是要求分解式子,然后统计每个因子的指数,实现+1后相乘,sum中就是结果,算法采用快速计算方法,每次都会把范围缩小到n/i然后开平方。
追问测试有一个超时了...
大神能不能再优化一下
能不能顺便解决一下这道题
zhi●dao.bai●du.co●m/question/1175183927105812419.html
全部回答
- 1楼网友:西岸风
- 2021-03-25 11:50
10^12 是异或运算,还是你写错了追问10的12次方追答#include
int main()
{
long int i,n,count=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if(n%i==0)
count++;
}
printf("%d",count);
return 0;
}
如果觉得对,可以采纳追问效率...
这样子会超时的追答#include
int main()
{
long int i,n,count=0;
scanf("%d",&n);
for(i=1;i<=n/2;i++)
{
if(n%i==0)
count++;
}
count++;
printf("%d",count);
return 0;
}
节省一半时间!追问要求:
时间 内存
1000MS
32768KB追答你这题急用吗?给我你的邮箱等我晚上给你遍,因为数据结构的一些知识我忘了!(别忘了点赞哦)
int main()
{
long int i,n,count=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if(n%i==0)
count++;
}
printf("%d",count);
return 0;
}
如果觉得对,可以采纳追问效率...
这样子会超时的追答#include
int main()
{
long int i,n,count=0;
scanf("%d",&n);
for(i=1;i<=n/2;i++)
{
if(n%i==0)
count++;
}
count++;
printf("%d",count);
return 0;
}
节省一半时间!追问要求:
时间 内存
1000MS
32768KB追答你这题急用吗?给我你的邮箱等我晚上给你遍,因为数据结构的一些知识我忘了!(别忘了点赞哦)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯