帮初学者改代码——playerc之“练习:求完数问题”(下)
前文链接:帮初学者改代码——playerc之“练习:求完数问题”(上)
再来看看be_ferfect()应该如何改。
be_ferfect()函数的功能是判断number是否为完数,同时把因子对写入divisers数组。以28这个完数为例,在数组中将依次写入
1 28 2 14 4 7
输出时则按要求依大小次序输出 1 2 4 7 14。先从前跳到后,到头之后掉头,再从后跳到前。
这种写入的方式决定了输出代码写起来要困难一些。如果希望输出写得容易些的话,写入时就必须改变这种图省事的办法。
有很多种方案可选:
第一种方案,从小到大写
int divisers_count = 1 ;
for ( i = 2 ; i < number ; ++ i ){
if (!( number % i)){ divisers[divisers_count ++ ] = i;
sum += i; if ( sum > number )
return false;
}
}
这显然简洁多了。作者没有考虑这种方法应该是有自己的想法,估计是认为一对儿一对儿的写更快些。对比一下
int divisers_count = 2 ;
for ( i = 2 , i_max = sqrt(number)+1 ; i < i_max ; ++ i ){
if (!(number % i)){
divisers[divisers_count ++ ] = i;
sum += i;
diviser = number / i ;
if ( diviser != i ) {
divisers[ divisers_count ++ ] = diviser;
sum += diviser;
}
if ( sum > number )
return false;
}
}
作者的写法做了大约2√n次除法、求余和不等于运算,而第一种方案要做n-1次除法。作者的写法虽然复杂,但优势还是有一些的。
第二种方案,用两个数组存储因子
1 2 4
28 14 7
这样即保留了作者算法的优势,输出的代码也比较容易写。但这要整个地修改代码的基本数据结构,改动比较大。所以这里就不用了。
第三种方案,从数组两头向中间存储
1 2 4 0 0 0 …… 7 14
这种方案,虽然看起来有点别扭,但读写数组都更容易些,也不需要改动数据结构,权衡之下,是唯一较为可取的方案。
采用这种方案的代码如下:
#include <stdio.h>
#include <stdbool.h> bool be_ferfect( int , int * , int * );
void output( int [] , int ); #define TOP (10000)
#define DIVISERS_MAX_LENGTH ((3+1)*(1+1)*(1+1)*(1+1)*(1+1)) int main( void )
{
int number; for( number = 2 ; number < ( TOP + 1 ) ; ++number ){ int divisers[DIVISERS_MAX_LENGTH] = { 1 } ; if ( be_ferfect( number , divisers ,
divisers + DIVISERS_MAX_LENGTH - 1 ) ){
printf("%d ,Its factors are : ", number) ;
output ( divisers , DIVISERS_MAX_LENGTH ) ;
}
} return 0;
} bool be_ferfect( int number , int * p_b , int * p_e )
{
int i ;
int sum = * p_b ++ ; for ( i = 2 ; i * i < number ; ++ i ){
if ( number % i != 0 )
continue ; sum += ( * p_b ++ = i ) + ( * p_e -- = number / i ) ; if ( sum > number )
return false;
} if ( i * i == number )
sum += ( * p_b ++ = i) ; return sum == number ;
} void output ( int divisers[] , int size )
{
int i ; for ( i = 0 ; i < size ; i ++ ){ if ( divisers[i] == 0 )
continue ; printf ("%d ",divisers[i]);
}
putchar('\n');
}
(完)
帮初学者改代码——playerc之“练习:求完数问题”(下)的更多相关文章
- 帮初学者改代码——playerc之“练习:求完数问题”(上)
原文:“练习:求完数问题” 原代码: // #include <stdio.h> #include <stdlib.h> #include <math.h> #de ...
- 帮初学者改代码——有多少青春可以挥霍之“c语言 多重排序”
原文:“c语言 多重排序” 原代码: #include<stdio.h> #include<string.h> struct A { char name[100]; int g ...
- 蓝桥杯 算法训练 ALGO-152 8-2求完数
算法训练 8-2求完数 时间限制:50.0s 内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例 ...
- openmp 并行求完数
// GetWanShu.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "omp.h" #inclu ...
- Java50道经典习题-程序9 求完数
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. public class Prog9 { public stati ...
- JAVA 基础编程练习题9 【程序 9 求完数】
9 [程序 9 求完数] 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如 6=1+2+3.编程找出 1000 以内的 所有完数. package cskaoyan ...
- Java实现 蓝桥杯VIP 算法训练 求完数
问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例输出 与上面的样例输入对应的输出. 例: 数据规模和约定 1-9999 publi ...
- ALGO-152_蓝桥杯_算法训练_8-2求完数
记: 掌握完数的概念 AC代码: #include <stdio.h> int main(void) { int i,j,sum; ; i <= ; i ++) { sum = ; ...
- OpenMP求完数
源代码: #include "stdafx.h" //必须写在首行,因为其前面的include都会被忽略 #include "omp.h" #include & ...
随机推荐
- SQLSERVER 16进制转10进制
原码.补码.反码参考: http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 进制转换参考: http://ww ...
- Xcode编译错误和警告汇总<转>
1.error: macro names must be identifiers YourProject_prefix.pch 原因: 因为你弄脏了预处理器宏,在它处于<Multiple Val ...
- UIImage 调整图片大小
-(UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size { UIGraphicsBeginImageContext(size); [img d ...
- python笔记 - day6
python笔记 - day6 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 大纲: 利用递归,实现阶乘: Python反射 pyt ...
- saltstack之(七)配置管理系统初始化init
saltstack的配置管理分环境管理:①.base为基础环境,一般会存放一些所有服务器都使用的配置管理信息.②.dev为开发测试环境,一般会存放一些开发测试服务器使用的配置管理信息.③.pro为线上 ...
- 获取Spring的ApplicationContext的方法
在网上搜了一下,写一下我试用的两个方法. 1 2 ApplicationContext ctx=new FileSystemXmlApplicationContext("/applica ...
- 磁盘空间已满导致rabbitmq无法启动
rabbitmq-server 启动问题 今天遇到一个挺奇怪的 rabbitmq-server 的启动问题. 在内部使用的 openstack 环境上,rabbitmq-server突然就关掉了,无法 ...
- 由一个Servlet 看java入门常犯的几个错误
安装完java环境后,cmd-javac 报错 ------------->环境变量配错了,最后全配成系统变量,ok了 能浪费一天的时间 写一个最简单的Servlet ,to ...
- JBOSS安全配置
1.jmx-console登录的用户名和密码设置 默认情况访问http://localhost:8080/jmx-console就可以浏览jboss的部署管理的一些信息,不需要输入用户名和密码,使用起 ...
- Speed-BI数据分析案例:2016年7月汽车销量排行榜
据中国汽车工业协会统计分析,2016年7月,汽车产销比上月均呈下降,同比呈较快增长.1-7月,汽车产销保持稳定增长,增幅比上半年继续提升. 7月,汽车生产195.96万辆,环比下降4.38%,同比增长 ...