题目链接:http://ac.jobdu.com/problem.php?pid=1087

题目描述:

输入n个整数,依次输出每个数的约数的个数

输入:

输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。

输出:

可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。

样例输入:
5
1 3 4 6 12
样例输出:
1
2
3
4
6

这个题目呢,大家可以对比一下以下不同的做法。

代码一:九度oj测试结果耗时290ms。

 /*
* Main.c
*
* Created on: 2014年1月15日
* Author: Shaobo
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h> int main(void){
int N;
int * data = NULL;
int i, j;
int cnt, tmp; while (scanf("%d", &N) == && N != ){
data = (int *)malloc(sizeof(int) * N);
if (data == NULL)
break;
for (i=; i<N; ++i)
scanf("%d", &data[i]);
for (i=; i<N; ++i){
cnt = ;
for (j=; j<=(int)sqrt(data[i]*1.0); ++j){
if (data[i] % j == ){
cnt = cnt + ;
}
}
tmp = (int)(sqrt(data[i]*1.0));
if (tmp * tmp == data[i])
--cnt;
printf("%d\n", cnt);
}
free(data);
}
return ;
}

代码二:耗时间1000ms

 int main(void)
{
int N;
int i, j;
int cnt; int num;
int t;
while (scanf("%d", &N) == && N != )
{
for (i=; i<N; ++i)
{
scanf("%d", &num);
cnt =;
for (j=; j<=num;j++)
{
t=;
while(num % j==)
{
t++;
num=num/j;
}
cnt = cnt*(t+);
}
printf("%d\n", cnt);
}
}
return ;
}

代码三:耗时20ms

 int main(void)
{
int N;
int i, j;
int cnt; int num;
int t;
while (scanf("%d", &N) == && N != )
{
for (i=; i<N; ++i)
{
scanf("%d", &num);
cnt =;
for (j=; j*j<=num;j++)
{
t=;
while(num % j==)
{
t++;
num=num/j;
}
cnt = cnt*(t+);
}
if(num>) cnt=cnt*;
printf("%d\n", cnt);
}
}
return ;
}

关于代码二、三的原理,请看下面这个数学题:

代码二耗时较大的原因,我想应该是这样:

当num是一个比较大的质数时, while(num % j==0)的时间复杂度会退化到O(x)。采用类似代码一或代码三的借助sqrt的优化后,时间复杂度是O(sqrt(x))。

九度oj 题目1087:约数的个数的更多相关文章

  1. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. windows添加虚拟网卡

  2. 51nod 1264 线段相交(几何)

    题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该 ...

  3. jquery ui学习笔记

  4. [ie兼容]ie7浮动左在前,浮动右在后导致右边浮动的元素掉下来

    解决办法:左浮动和右浮动元素在结构上互换位置 http://blog.sina.com.cn/s/blog_818a1e5b0100wp5b.html

  5. AspectJ的基本使用

    参考: https://my.oschina.net/itblog/blog/208067

  6. hdu 1052 (greedy algorithm) 分类: hdoj 2015-06-18 16:49 35人阅读 评论(0) 收藏

    thanks to http://acm.hdu.edu.cn/discuss/problem/post/reply.php?action=support&postid=19638&m ...

  7. layoutSubviews总结

    ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ——————- - (void)layoutSubview ...

  8. int a

    系统编译之后所有的变量都存储到符号表中,并且每个表项被分配一个符号ID,一般也是数字的,可以根据该符号的ID直接访问符号的值内存中的数据都是二进制的,没有ASCII值ASCII只在为便于人的理解,对二 ...

  9. 闭包的理解-from my own opinion

    闭包,说起来那么难,其实理解了作用域,那么理解闭包就容易多了. 全局环境,局部环境,这两个概念很好理解了.那么要深入理解下函数的局部环境. 函数的局部环境,也就是说在一个函数内定义的变量,这个变量只能 ...

  10. Java甘特图控件swing版免费下载地址

    FlexGantt 控件是现在Java 平台下最先进的甘特图解决方案,使用一个很高的抽象层次,能适用于多种不同的域,例如 ERP 系统.生产计划和日程安排.制造流程系统或项目公文管理程序等.这些使得 ...