九度oj 题目1087:约数的个数
题目链接: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题目&吉大考研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,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- c++虚函数的作用是什么?
<深入浅出MFC>中形容虚函数是执行一般化操作,一直没有领悟要点.现在的体悟是抽象,先前考虑问题都是由抽象到具象,比如下文中的示例,由上(虚基类的「怪物」)至下(派生类的三个子类「狼」「蜘 ...
- Spring <bean> 参数意义
1.id bean的唯一标识, 2.class 类的完全限定名, 3.parent 父类bean定义的名字. 如果没有任何声明,会使用父bean,但是也可以重写父类.重写父类时,子bean 必须与父b ...
- Oracle10g_Dataguard__161031
1.查看 redo log 信息 1.1.desc v$log ZC: 不明白这是查看什么信息... 1.2. 查看redo log file SQL> select * from v$log ...
- 转json using指令
using Newtonsoft.Json;using Newtonsoft.Json.Converters; string result = JsonConvert.SerializeObject( ...
- HTML 标题<h1>-<h6>
定义和用法 <h1> - <h6> 标签可定义标题.<h1> 定义最大的标题.<h6> 定义最小的标题. 由于 h 元素拥有确切的语义,因此请您慎重地选 ...
- ReferentialConstraint 中的依赖属性映射到由存储生成的列
ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...
- android快速入门
1.安装环境(jre java 运行环境,jdk java 开发工具包) 2.android studio 一.快捷键的使用 1. To open any class in the editor q ...
- IT公司100题-28-整数的二进制表示中1的个数
问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1. 分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进 ...
- 使用Spring整合javaMail发用邮件
1.导入javamail.jar 自行百度下载 2.使用模板发送邮件架包 freemarker.jar 3.Spring配置文件 以及架包这里就不需要说了吧,如果不明白的发我Email ...
- ios7中的多任务
转自:http://onevcat.com/2013/08/ios7-background-multitask/ WWDC 2013 Session笔记 - iOS7中的多任务 iOS7的后台多任务特 ...