题目链接: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. MFC编程入门之十七(对话框:文件对话框)

    上一讲介绍的是消息对话框,本节讲解文件对话框.文件对话框也是很常用的一类对话框. 文件对话框的分类 文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见到这两种文件对话框 ...

  2. TextView 行数控制

    控制textview只显示 2 行文本,超过 2 行显示展开/折叠按钮(mShowImage),isShow=true时,是展开状态,isShow=false时,是折叠状态 方法一: int line ...

  3. html 通用 遮罩弹出层 弹出后 支持跳转页面

    //showMessage 提示的内容默认为空必填 buttonText:按钮显示的内容默认为"确定" 传入 "" 为默认 url:跳转链接 传入"& ...

  4. Error: listen EADDRINUSE

    有可能是已经作用了18001端口 netstat -antp|grep 18001 kill 然后重启程序. events.js:72 throw er; // Unhandled 'error' e ...

  5. Android 如何解决数据库多线程锁的问题

    防止多个线程又是读取又是写入 网上找到的方法: 对于这样的问题,解决的办法就是keep single sqlite connection,保持单个SqliteOpenHelper实例,同时对所有数据库 ...

  6. guava学习--Ordering

    转载:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...

  7. 求助,JS 方法调用的问题,写了返回值,确调用时返回Undefined(新人第一次写)

    文本框txtUserName 的Onbulr 绑定方法 txtUserNameOnblur  这可以正常执行 而下面的btnRegister 的click 事件则无法正常调用    txtUserNa ...

  8. CentOs6.5下独立安装mysql篇

    1.安装包:Mysql: mysql-5.6.13.tar 一.源码包准备 (1)mysql-5.6.13.tar.gz 源码包.去www.mysql.com下载最新的mysql-5.6.13.tar ...

  9. Java - 简单的对象排序 - Comparator

    注:对象排序,就是对对象中的某一字段进行比较,以正序或倒序进行排序. 例: 需要排序的对象: public class Person { public int age; public String n ...

  10. golang——channel笔记

    1.for i := range channel { //... } 相当于 循环进行 i<-channel,直至close(channel) 2. · 给一个 nil channel 发送数据 ...