花朵数_蓝桥杯题目

一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。

程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。

解题思路:花朵数为21位数,肯定不是int/long所能表示的范围,所以本题使用大整数来表示。
那么有的同学可能想到了使用for循环遍历100…000~999…999这么多的21位数进行暴力破解,但是这个计算量是非常巨大的,计算机无法处理,那么我们应该怎么寻找其中符合条件的数呢?
有的同学可能想到了,21位数当中一定有许多重复的累加和。到这里也就不难想了,决定21位数字幂累加的和并不取决于数字的顺序,而是每个数字出现的次数。·
现在我们只需要对这个次数进行遍历就行了,这样我们的计算量就大大缩小了。
我们设置一个存放每个数字出现次数的数组,对它进行遍历,枚举21位数字的出所有可能。对每个可能都做计算,判断它是否为一个21位数,这个21位数中每个数字出现的个数是否与我们的数组一致。这样我们就可以得到这个21位花朵数了。

首先我们看一下大整数的方法:

vauleOf(int) 将整型数据转换为大数据
multiply() 大数据乘法
add() 大数据加法
.ZERO/.ONE 大数据0、1的定义

最后的计算结果比较:由于记录21位数据的方法采用的是一个存储数字出现次数的数组,所以要进行数组的判断。这里的比较方法是将计算的结果化为字符串s,对s中的字符进行解析化为数组,与原数组比较。

import java.math.BigInteger;

public class X11 {
static BigInteger[] x = new BigInteger[10];

public static BigInteger pow_21(int n){
    BigInteger b = BigInteger.ONE;
    for(int i=0;i<21;i++){
    b = b.multiply(BigInteger.valueOf(n));//21次乘以n,得n^21
    }
    return b;
}

public static void test(int[] a){
    BigInteger sum = BigInteger.ZERO;//总和
    for(int i=1;i<10;i++){//加9次(0的21次方等于0,不需要加)
        sum = sum.add(x[i].multiply(BigInteger.valueOf(a[i])));//valueOf(int) 方法对int进行转换为BigInteger大整数
    }
    //接下来比较
    String s = sum.toString();//大整数,使用字符串进行比较
    if(s.length() != 21) return;

    int[] a1 = new int[10];//注意是与a[]进行比较,所以需要将大整数的结果字符串进行解析

    for(int i=0;i<21;i++){
        a1[s.charAt(i) - '0']++;//按位处理结果,转换为a1[] 的数据
    }
    //比较
    for(int i=0;i<10;i++){
        if(a1[i] != a[i]) return;
    }

    System.out.println(s);
}

//x存放数字的21次方数据 , a存放数字出现次数 , cur当前处理的数字 , use已经使用的位数
public static void f(int[] a,int cur,int use){
    if(use == 21){
        test(a);
        return;
    }

    if(cur==9){//9个数字枚举完毕,进行计算判断
        a[9] = 21-use;
        test(a);//测试是否成功找到数字
        return;
    }

    //枚举
    for(int i=0; i<21-use; i++){

        a[cur] = i;//当前数字出现的次数:i
        f(a,cur+1,use+i);
        a[cur] = 0;//不要忘记回溯
    }
}

public static void main(String[] args) {
    //0~9的21次方给数组x[]
    for(int i=0; i<10; i++){
        x[i] = pow_21(i);//pow_21 方法计算21次方
    }
    int[] a = new int[10];//记录每个数字出现的次数

    f(a,0,0);//递归主方法
    }
}
//结果
//128468643043731391252
//449177399146038697307

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 蓝桥杯是著名的计算机竞赛,其中的Scratch题目是一个叫做五彩莲花的题目。五彩莲花是一个关于花朵绘制和动画效果设计的题目。 在这个题目中,我们可以使用Scratch这个图形化编程软件来绘制一朵美丽的莲花,同时还可以为这朵花添加动画效果,让它栩栩如生。 首先,我们需要使用Scratch中的绘画功能来绘制花瓣。可以利用彩色的图形积木来绘制花瓣的形状,也可以使用重复积木来复制花瓣,让整朵花更加丰富多彩。绘制花瓣的过程需要一定的技巧和创意,可以通过调整角度、大小和颜色等参来实现。 接下来,我们可以使用Scratch中的动画功能为花朵添加动态效果。可以利用跳跃、旋转、逐渐变大或变小等动画效果来模拟花朵绽放的过程,让花朵看起来更加生动。 除此之外,我们还可以通过Scratch中的声音效果来为花朵增添声音效果,比如花开的声音或花瓣掉落的声音,以增强花朵的真实感。 总结来说,通过Scratch编程软件,我们可以利用绘画功能和动画效果设计一朵五彩莲花。这项任务不仅涉及图形的绘制和动画的设计,还需要我们的创意和想象力。通过这个过程,我们不仅可以提升自己的编程技巧,还可以培养自己的创造力和艺术修养。这也是蓝桥杯Scratch五彩莲花题目的意义所在。 ### 回答2: 五彩莲花是蓝桥杯“Scratch”项目中的题目之一。Scratch是一款免费的编程教育软件,让学生可以通过拖拽积木式的图形化编程语言,来编写自己的创意作品。蓝桥杯作为一个计算机竞赛,S级组的五彩莲花题目要求参赛者使用Scratch来实现一个彩色莲花的图案。 在实现五彩莲花的过程中,参赛者需要使用Scratch中的绘图功能和控制语句来完成。首先,参赛者可以使用该软件的画笔积木来绘制莲花的基本形状,包括叶片和花瓣。可以使用不同颜色的画笔来绘制不同颜色的叶片和花瓣。 然后,参赛者需要使用循环积木来完成莲花的复制。通过重复绘制叶片和花瓣,可以实现莲花的全貌。为了使莲花更加美观,参赛者可以使用转动积木来让莲花旋转起来。 最后,参赛者可以为莲花添加交互功能,让用户可以通过点击或者其他方式来改变莲花的颜色或者形态。这样可以增加莲花的趣味性和互动性。 总的来说,实现五彩莲花的过程需要熟悉Scratch软件的各种功能和积木的使用方法。通过创造力和技术的结合,参赛者可以完成一个独特而华丽的五彩莲花作品。这个过程对参赛者的思维能力、创造力和编程技巧提出了很高的要求,同时也锻炼了他们的团队合作能力和解决问题的能力。蓝桥杯Scratch五彩莲花题目不仅有助于激发学生对计算机科学的兴趣,也为他们提供了一个展示自己才华和创意的舞台。 ### 回答3: 五彩莲花是蓝桥杯中的一道Scratch题目。莲花是一种美丽的花朵,象征着纯洁和吉祥,也是中国传统文化中的重要象征物之一。在这道题目中,我们需要使用Scratch软件来绘制一朵五彩莲花。 首先,我们需要创建一个新的Scratch项目。然后,在角色栏中选择一个合适的角色,可以选择一个花朵或莲花的角色作为基础。 接下来,我们需要绘制花朵的轮廓。可以使用Scratch中的绘图工具来绘制花瓣的形状。首先,在角色的笔触下放置一个“下笔”积木块,然后使用“移动”积木块来绘制花瓣的形状。可以使用循环积木块来绘制多个花瓣,并最终形成五彩莲花的轮廓。 完成花朵的轮廓后,我们可以为花朵添加五彩斑斓的颜色。可以使用“着色”积木块来选择不同的颜色,并将其应用到花朵的轮廓上。可以选择红、黄、蓝、绿等多种颜色,使五彩莲花更加绚丽多彩。 最后,可以为莲花添加一些动画效果,使其更加生动。可以使用积木块来使花朵旋转、平移、缩放等。还可以使用声音积木块,为花朵添加一些音效。 通过以上步骤,我们就可以完成一朵五彩莲花的绘制。在蓝桥杯的Scratch赛题中,我们还可以进一步挑战,增加一些创意和亮点,让我们的作品更加与众不同。在整个过程中,我们不仅锻炼了创造力和想象力,还学到了如何使用Scratch软件进行编程和绘图。这道题目既有趣又富有挑战性,是一次很好的学习和实践机会。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值