hdu 1528 Perfection(数论·因子和·C++·java)

2024-03-27 23:18

本文主要是介绍hdu 1528 Perfection(数论·因子和·C++·java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:http://poj.org/problem?id=1528

Perfection
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 11909 Accepted: 5595

Description

From the article Number Theory in the 1994 Microsoft Encarta: ``If a, b, c are integers such that a = bc, a is called a multiple of b or of c, and b or c is called a divisor or factor of a. If c is not 1/-1, b is called a proper divisor of a. Even integers, which include 0, are multiples of 2, for example, -4, 0, 2, 10; an odd integer is an integer that is not even, for example, -5, 1, 3, 9. A perfect number is a positive integer that is equal to the sum of all its positive, proper divisors; for example, 6, which equals 1 + 2 + 3, and 28, which equals 1 + 2 + 4 + 7 + 14, are perfect numbers. A positive number that is not perfect is imperfect and is deficient or abundant according to whether the sum of its positive, proper divisors is smaller or larger than the number itself. Thus, 9, with proper divisors 1, 3, is deficient; 12, with proper divisors 1, 2, 3, 4, 6, is abundant."
Given a number, determine if it is perfect, abundant, or deficient.

Input

A list of N positive integers (none greater than 60,000), with 1 <= N < 100. A 0 will mark the end of the list.

Output

The first line of output should read PERFECTION OUTPUT. The next N lines of output should list for each input integer whether it is perfect, deficient, or abundant, as shown in the example below. Format counts: the echoed integers should be right justified within the first 5 spaces of the output line, followed by two blank spaces, followed by the description of the integer. The final line of output should read END OF OUTPUT.

Sample Input

15 28 6 56 60000 22 496 0

Sample Output

PERFECTION OUTPUT15  DEFICIENT28  PERFECT6  PERFECT56  ABUNDANT
60000  ABUNDANT22  DEFICIENT496  PERFECT
END OF OUTPUT
分析:
由于a!=-1 && a!=1所以b是除number本身外的所有因子。完美数就是所有因子的和对number进行素因子分解,分解情况:a1-q1 a2-q2 …… an-qn 那么所有的因子和应该等于:(1+a1+a1^2+……+a1^q1)(1+a2+a2^2+……+a2^q2)……(1+an+an^2+……+an^qn)  对于每一项:1+a+a^2+……+a^n等比数列求和,当:
n是奇数时,乘积等于(1+a^(n/2+1))(1+a+……+a^(n/2)). (奇转偶)
n是偶数时,乘积等于(1+a^(n/2+1))(1+a+……+a^(n/2-1))+a^(n/2).   (偶转奇)
用C++很快写完并成功1A,想到刚学java,于是试着用java仿照着写写看,好家伙,运行时间,内存消耗都增长了不少,而且还莫名的错了好几次。CE因为类名的问题,WA是因为没有及时在输入0时跳出,PE则是System.out.println("PERFECTION OUTPUT\n");   ||-_-

c++:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fac[300],p[300],top;
void resolve(int x){top=0;memset(p,0,sizeof(p));for(int i=2;i*i<=x;i++){if(x%i==0){fac[top]=i;while(x%i==0){x/=i;p[top]++;}top++;}}if(x>1){fac[top]=x;p[top++]++;}
}
int power(int a,int n){int ans=1,temp=a;while(n){if(n&1) ans=ans*temp;temp=temp*temp;n>>=1;}return ans;
}
int cal(int a,int n){if(n==2) return (1+a+a*a);if(n==1) return (1+a);if(n&1) return (1+power(a,n/2+1))*cal(a,n/2);else return (1+power(a,(n/2+1)))*cal(a,(n/2-1))+power(a,(n/2));
}
int main()
{//freopen("cin.txt","r",stdin);int a;printf("PERFECTION OUTPUT\n");while(cin>>a&&a){resolve(a);int res=1;for(int i=0;i<top;i++){res=res*cal(fac[i],p[i]);}printf("%5d  ",a);res=res-a;if(res<a) puts("DEFICIENT");else if(res==a) puts("PERFECT");else puts("ABUNDANT");}printf("END OF OUTPUT\n");return 0;
}
java:
import java.util.*;
import java.lang.String;
public class Main {static int[] fac=new int [300],p=new int [300];static int top;static void resolve(int x){top=0;Arrays.fill(p,0); //Arrays belong to utilfor(int i=2;i*i<=x;i++){if(x%i==0){fac[top]=i;while(x%i==0){x/=i;p[top]++;}top++;}}if(x>1){fac[top]=x;p[top++]++;}}static int power(int a,int n){int ans=1,temp=a;while(n>0){if(n%2==1) ans=ans*temp;temp=temp*temp;n>>=1;}return ans;}static int cal(int a,int n){if(n==2) return (1+a+a*a);if(n==1) return (1+a);if(n%2==1) return (1+power(a,n/2+1))*cal(a,n/2);else return (1+power(a,(n/2+1)))*cal(a,(n/2-1))+power(a,(n/2));}public static void main(String[] args) {int a;Scanner sc=new Scanner(System.in);System.out.println("PERFECTION OUTPUT");while(sc.hasNextInt()){a=sc.nextInt();if(a==0) break;resolve(a);int res=1;for(int i=0;i<top;i++){res=res*cal(fac[i],p[i]);}String str;res=res-a;if(res<a) str="DEFICIENT";else if(res==a) str="PERFECT";else str="ABUNDANT";System.out.printf("%5d  %s\n",a,str);}System.out.printf("END OF OUTPUT\n");}}
/*class perfect is public, should be declared in a file named perfect.java
public class perfect {^
把perfect 改成Main即可。(public修饰的类名必须和文件名一样)
*/



这篇关于hdu 1528 Perfection(数论·因子和·C++·java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853721

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准