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

题目描述:

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

输入:

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

输出:

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

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

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

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

  1. /*
  2. * Main.c
  3. *
  4. * Created on: 2014年1月15日
  5. * Author: Shaobo
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10.  
  11. int main(void){
  12. int N;
  13. int * data = NULL;
  14. int i, j;
  15. int cnt, tmp;
  16.  
  17. while (scanf("%d", &N) == && N != ){
  18. data = (int *)malloc(sizeof(int) * N);
  19. if (data == NULL)
  20. break;
  21. for (i=; i<N; ++i)
  22. scanf("%d", &data[i]);
  23. for (i=; i<N; ++i){
  24. cnt = ;
  25. for (j=; j<=(int)sqrt(data[i]*1.0); ++j){
  26. if (data[i] % j == ){
  27. cnt = cnt + ;
  28. }
  29. }
  30. tmp = (int)(sqrt(data[i]*1.0));
  31. if (tmp * tmp == data[i])
  32. --cnt;
  33. printf("%d\n", cnt);
  34. }
  35. free(data);
  36. }
  37. return ;
  38. }

代码二:耗时间1000ms

  1. int main(void)
  2. {
  3. int N;
  4. int i, j;
  5. int cnt;
  6.  
  7. int num;
  8. int t;
  9. while (scanf("%d", &N) == && N != )
  10. {
  11. for (i=; i<N; ++i)
  12. {
  13. scanf("%d", &num);
  14. cnt =;
  15. for (j=; j<=num;j++)
  16. {
  17. t=;
  18. while(num % j==)
  19. {
  20. t++;
  21. num=num/j;
  22. }
  23. cnt = cnt*(t+);
  24. }
  25. printf("%d\n", cnt);
  26. }
  27. }
  28. return ;
  29. }

代码三:耗时20ms

  1. int main(void)
  2. {
  3. int N;
  4. int i, j;
  5. int cnt;
  6.  
  7. int num;
  8. int t;
  9. while (scanf("%d", &N) == && N != )
  10. {
  11. for (i=; i<N; ++i)
  12. {
  13. scanf("%d", &num);
  14. cnt =;
  15. for (j=; j*j<=num;j++)
  16. {
  17. t=;
  18. while(num % j==)
  19. {
  20. t++;
  21. num=num/j;
  22. }
  23. cnt = cnt*(t+);
  24. }
  25. if(num>) cnt=cnt*;
  26. printf("%d\n", cnt);
  27. }
  28. }
  29. return ;
  30. }

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

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

当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. 爬虫:获取多次跳转后的页面url

    <?php $url = "xxxx"; $xx = get_headers($url,true); var_dump($xx); ?> Nbimer主页 剖面加阴影应 ...

  2. css代码段

    css文字超出省略 .demo{ display:-webkit-box; overflow:hidden; text-overflow:ellipsis; -webkit-line-clamp:2; ...

  3. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter与org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  4. js调用父窗口中的方法

    window.open调用父窗口中的方法 回调函数: function fun9(ex){ alert(ex); } 调用语句: window.open("RoomSelecter.htm? ...

  5. H5横向三栏布局

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  6. 删除桌面IE图标

    B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B HKEY_USERS\S-1-5-21-3567631753-1637826720-2857290141-500\Softwa ...

  7. C#微信公众号开发-高级接口-之网页授权oauth2.0获取用户基本信息(二)

    C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一) 中讲解了如果通过微信授权2.0snsapi_base获取已经关注用户的基本信息,然而很多情况下我们经常需要获取非关注用户的信息,方法 ...

  8. iOS开发UI篇—模仿ipad版QQ空间登录界面

    iOS开发UI篇—模仿ipad版QQ空间登录界面 一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的 ...

  9. 正则表达式学习与python中的应用

    目录: 一.正则表达式的特殊符号 二.几种重要的正则表达式 三.python的re模块应用 四.参考文献 一.正则表达式的特殊符号 特殊符号可以说是正则表达式的关键,掌握并且可以灵活运用重要的pyth ...

  10. PowerShell脚本:随机密码生成器

    脚本名称:s随机密码生成器_v2.63.ps1脚本作用:产生随机密码.每密码字符个数,密码数量,存盘位置等可以自定义.脚本用法:脚本采用了硬编码,所以你需要打开脚本,修改如下变量:$生成密码总个数 = ...