python中给出一个不超过10的正整数n_1030 完美数列 (25 分)C、Java、python

题目描述

给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。

现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入描述:

输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数

不超过109。

输出描述:

在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入例子:

10 8

2 3 20 4 5 1 6 7 8 9

输出例子:

8

思路

将输入的数用sort()进行排序,然后用双循环从头到尾和从尾到头进行题目要求的比较,满足要求就计数。即对数组先进行排序(升序),以样例来说,排序完后,顺序为:1,2,3,4,5,6,7,8,9,20;那么选择v[0]为最小数,乘p,那么可以取的M的可以为1,2,3,4,5,6,7,8。一共有8个,假如进行第二次遍历,从v[1]开始,那么可以选择便有2,3,4,5,6,7,8,9,共有8个。我们只需要这样遍历便可以得到最长的完美数列。

C

1 #include

2 int cmp(const void * a, const void *b) {3 return *(long int *)a - *(long int *)b;//升序

4 }5 intmain() {6 int N, max = 0;//正整数个数, 完美数列最多含有的数字个数

7 long int p;//参数p

8 scanf("%d %ld", &N, &p);9 long intarr[N];10 for (int i = 0; i < N; i++) {11 scanf("%ld", &arr[i]);12 }13 qsort(arr, N, sizeof(long int),cmp);//升序排序

14 for (int i = 0; i + max <= N; i++) {//数列未取完

15 for (int j = i + max; j < N; j++) {//超过完美数列数字个数,是否为完美数列

16 if(arr[j] <= (arr[i] *p)) {17 max = j - i + 1;18 } else {//如果不是,后续元素更大,更不可能是,跳出循环即可

19 break;20 }21 }22 }23 printf("%d\n", max);24 return 0;25 }

Java

1 importjava.util.Scanner;2 importjava.util.Arrays;3 public classShulie01 {4 public static voidmain(String[] args) {5 @SuppressWarnings("resource")//这句是装饰,为了美观

6 Scanner in=newScanner(System.in);7 int n = in.nextInt();//输入第一个数

8 int p = in.nextInt();//输入第二个数

9 int[] arr = new int[n];//定义一个一维数组

10 for(int i = 0;i

11 arr[i] =in.nextInt();12 Arrays.sort(arr);//对数组进行从小到大排序

13 int maxlen = 0;//计数变量

14 for(int i = 0;i

15 for(int j = i+maxlen;j

16 if(arr[j]>arr[i]*p) {//如果不符合完美数列,跳出循环

17 break;18 }19 maxlen++;//符合条件计数

20 }21 }22 System.out.println(maxlen);//输出最多可以选择多少个数可以用它们组成一个完美数列

23 }24 }

JAVA中sort函数的使用方法

在java.util.Collections类中有个sort()方法,主要是用来给数组排序,排序的规则可以自己重写。它是Arrays类的静态方法。

sort()函数的基本格式(默认排序为升序排序)。

Arrays.sort(int[] a, int fromIndex, int toIndex);即Arrays.sort(数组名,起始下标,终止下标);

如果一个数组初始化时已经赋值。则sort函数可以另外一种格式

Arrays.sort(数组名);

如果读者不是很了解,可以暂时不去管它,如果真的很想了解,建议查阅我的推荐的一本书《Java从入门到经通》,上面有详细的介绍。

python

1.对最小值的选取从有序列表第一项开始循环;

2.在上述循环内对最大值的选取进行循环,保存此时的完美数列项数;

3.既然我们是为了获取完美数列项数最大值,那就注意,最大值所在内层循环可以优化:从最小值index加上完美数列项数形成下一次内层循环的最小index。

附:

#split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串

#sorted() 函数可以对任意可迭代对象排序

1 n,q = map(int, input().split()) #获取数列长度n,完美数列所需比值q

2 li = list(map(float, input().split())) #获取数列

3 li.sort() #对数列排序

4 m = 0 #符合条件的完美数列长度,初始化为0

5 for i in range(n): #完美数列最小项循环

6 m_q = li[i] * q #完美数列最小项*q

7 next_ = i+m #完美数列最大项+1,作为内层完美数列最大项循环的下界

8 if next_ >= n: #判断是否已达到数列末项

9 break

10 for j in range(next_,n): #完美数列最大项循环

11 if li[j] <= m_q: #第j项满足完美数列条件,则完美数列长度+1

12 m += 1

13 else: #最大值项达不到条件,推出循环

14 break

15 print(m)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值