题目链接: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:约数的个数的更多相关文章
-
九度oj题目&;amp;吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
-
九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
-
hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
-
九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
-
九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
-
九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
-
九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
-
九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
-
九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
-
TP框架常用(一)
25.显示最后一条查询的sql语句:主要用于在连贯操作时,检测拼接的sql语句是否正确 echo $this->db->last_query();//如:select * from pt_ ...
-
ubuntu set ntpdate
1. 安装ntpdate工具 # sudo apt-get install ntpdate 2. 设置系统时间与网络时间同步 # ntpdate cn.pool.ntp.org 3. 将系统时间 ...
-
Mac 下Cordova开发
一 Cordova开发环境搭建 1,安装node.js环境 官网: http://nodejs.org/ 下载包安装 2,使用命令行安装 cordova 主要命令: 安装Cordova: sudo ...
-
【Linux/Ubuntu学习1】Linux /etc 目录详解
/etc目录 包含很多文件.许多网络配置文件也在/etc 中. /etc/rc or/etc/rc.d or/etc/rc*.d 启动.或改变运行级时运行的scripts或scripts的 ...
-
Android 使用LinearLayout.getChildAt(i)获取一个线性布局的view,并实现content中实现方法
1.定义接口content的方法,如ok,cancle; 2.在View的处理类myview中实现content的方法. 3.通过contently.getChildAt(i)的方法获得View v; ...
-
div如何加滚动条
<div style="position:absolute; height:400px; overflow:auto"></div>div 设置滚动条显示: ...
-
Redis Sentinel的Redis集群(主从&;Sharding)高可用方案
在不使用redis3.0之后版本的情况下,对于redis服务端一般是采用Sentinel哨兵模式,也就是一主多备的方式. 这里,先抛出三个问题, 问题1:单节点宕机数据丢失?问题2:多节点(节点间没有 ...
-
主线程中也不绝对安全的 UI 操作
从最初开始学习 iOS 的时候,我们就被告知 UI 操作一定要放在主线程进行.这是因为 UIKit 的方法不是线程安全的,保证线程安全需要极大的开销.那么问题来了,在主线程中进行 UI 操作一定是安全 ...
-
C#隐藏父类
一.override和new 关键字隐藏父类的方法 正常情况下,父类virtual的方法,子类override class Animal { public virtual void EatFood() ...
-
c# 溢出上下文检测
对于类型转换是否溢出可以用 checked和unchecked运算符 在unchecked上下文中会忽略溢出 在checked 会抛出异常 ; byte sb; sb = unchecked((byt ...