蓝桥杯练习——不定方程解法

问题

对形如ax+by=c的不定方程求它的解

分析

一般会采用暴力破解的方法,即在给定数据区间内进行循环,然后找到符合条件的输出。但是这样要用到两重循环,对于数据体量大的情况解决效率很低

解决

ax+by=c

即:ax=c-by

只需要找到一个y满足c-by可以被a整除即可找到一个解,一重循环

1.从小到大尝试,求出一个特解:x0,y0

2.求通解:x=x0+at;y=y0-bt;t根据题目取值-1,-2,0 ,1,2,3等

代码

import java.util.Scanner;
/** 求解:ax+by=c * ax=c-by* */
public class MaiBuDao {public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner=new Scanner(System.in);int a=scanner.nextInt();int b=scanner.nextInt();int c=scanner.nextInt();int x=0,y=0,i,t,x0=0,y0=0;for(i=0;i<=10000;i++) {if((c-b*i)%a==0) {y0=i;x0=(c-b*i)/a;break;}}for(t=0;t<=1000;t++) {x=x0+a*t;y=y0-b*t;System.out.println(x+" "+y);}}
}

延申

大部分题目不会简单的让求一个公式的解,更多的会变换一些方式。

比如有的题可能和不等式的解法这一个公式关系不大,主要是对原有的问题变换一种解题思路

例题——鲜花数

视频学习

问题

一个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时 ,所有满足条件的花朵数。 注意:当N=21时,这个整数有21位 ,它的各 个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占-行。因为这个数字很大,请注意解法时间上的可行性。

【输入】一个整数N

【输出】所有满足的数

思路

这道题很像“水仙花数”,“玫瑰花数”,一般都是直接暴力破解。比如这样的:

public class RoseNum {public static void main(String[] args) {// TODO Auto-generated method stubint i,j,x,sum=0;for(i=100;i<=999;i++) {j=i;while(j>0) {x=j%10;sum+=(x*x*x);j/=10;}if(sum==i) {System.out.println(i);}sum=0;}}
}

但是,如果幂的次数达到21的话直接循环肯定是行不通的

假如某个数是它各个位置上的和,那么如果将这数某两位交换位置也并不影响最后算出的总和。所以大致思路就是先算出0-9每个数的N次幂,存在一个数组baseBigIntegers中,对于每个数字数字的次数,用一个数组num来存储。

所有出现的数字的21次幂乘以出现次数算出总和,再看总和中每个数字出现的次数和原数每个数字出现次数比较,如果相等,则是所求答案。

baseBigIntegers数组:存放0-9的N次幂

num数组:0-9各出现几次

sumn数组:和的各位数字各出现几次

cal函数:用来计算0-9的N次幂

​ 其中,用到BigInteger类,这个类适用于体量非常大的大整数,常用方法.ONG置一,.ZERO置零,.valueOf()取得某数的数值,.multiply()乘,.add加。

fun函数:用来试探num数组的各位可以置成什么值

​ k代表当前进行到0-9中的哪个数,sum代表剩余名额。因为所有数字总共出现N次,所以每次从0-sum试探,而进入下一层递归的时候sun要减去已经置好的次数。

test函数:用来判断置的这一组值是否符合要求

代码

import java.math.BigInteger;
import java.util.Scanner;
public class Flowers {public static int N;public static BigInteger[] baseBigIntegers=new BigInteger[10]; //存放每个数字的21次方public static BigInteger cal(int n) {BigInteger aBigInteger=BigInteger.ONE;int i;for(i=0;i<N;i++) {aBigInteger=aBigInteger.multiply(BigInteger.valueOf(n));}return aBigInteger;}public static void test(int[] num) {int i;BigInteger sumnBigInteger=BigInteger.ZERO;for(i=0;i<num.length;i++) {sumnBigInteger=sumnBigInteger.add(baseBigIntegers[i].multiply(BigInteger.valueOf(num[i])));}       //算出总和String string=sumnBigInteger.toString();if(string.length()!=N)return;int sumn[]=new int[10];for(i=0;i<string.length();i++) {sumn[string.charAt(i)-'0']++;}for(i=0;i<10;i++) {     //两边次数相等即是答案if(sumn[i]!=num[i])return;}System.out.println(sumnBigInteger);}public static void fun(int[] num,int k,int sum) {int i;if(sum==0) {     //试探次数用完了test(num);return;}if(k==num.length-1) {     //试到最后一位,次数全是最后一位的num[k]=sum;test(num);return;}for(i=0;i<=sum;i++){    num[k]=i;         //先试试能否置成这个次数fun(num, k+1, sum-i);   //试探下一位,名额-用掉的num[k]=0;       //回溯}}public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner=new Scanner(System.in);N=scanner.nextInt();//对0-9求21次方,存放在base数组中int i;for(i=0;i<baseBigIntegers.length;i++) {baseBigIntegers[i]=cal(i);}//定义一个数组num记录每个数字出现几次int []num=new int[10];//查找,fun函数,num[],进行到第几个k,还剩几个名额sumfun(num,0,N);}
}

蓝桥杯练习——不定方程解法2021.2.23相关推荐

  1. 【蓝桥杯真题】2021年蓝桥杯省赛A组题目解析+代码(python组)

    2021年蓝桥杯省赛A组题解(python组) 来自微信公众号:算法梦工厂,二维码见文末. 欢迎加入蓝桥杯备赛群:768245918,获取往届试题,测试数据,算法课程等相关资源. A:卡片 答案:31 ...

  2. 第十三届蓝桥杯青少年STEMA(2021.08-2021.03)C++

    蓝桥杯2022年1月STEMA C++中级组编程真题解析 蓝桥杯2022年1月STEMA C++中级组编程真题解析_竹 子的博客-CSDN博客 第十三届蓝桥杯青少年C++中级组2021年11月比赛题目 ...

  3. 2022年_蓝桥杯_省赛_4月23日真题_第十三届_python_第六题_小蓝对角线找奖品

    蓝桥杯真题又来了啊,上题目: 题目: (注.input()输入函数的括号中不允许添加任何信息) 编程实现: 有一个N*M的矩阵方格,其中有些方格中有奖品,有些方格中没有奖品.小蓝需要从N*M的矩阵中选 ...

  4. 【蓝桥杯基础题】2021年省赛填空题—卡片

  5. 强力党逗志芃(蓝桥杯)python解法

    题目 # 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能. # 现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 # 的技能(有一个最根本的技能不需要前 ...

  6. 蓝桥杯-火星人-python解法

    题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学 ...

  7. 蓝桥杯青少创意编程python组

    第十二届蓝桥杯青少年组国赛C++中级组 第1题 -- 第3题(python3实现) 第十二届蓝桥杯青少年组国赛C++中级组 第1题 -- 第3题(python3实现)_dllglvzhenfeng的博 ...

  8. 第十一届蓝桥杯青少组Python竞赛真题

    第十一届蓝桥省赛Python组复盘 第十一届蓝桥省赛Python组复盘_哔哩哔哩_bilibili 蓝桥杯青少组Python竞赛真题讲解 蓝桥杯青少组Python竞赛真题讲解_哔哩哔哩_bilibil ...

  9. 蓝桥杯青少年创意编程 C++组 国赛(第11届、第12届、第13届)

    蓝桥杯青少年组第十一届C++全国赛高级组讲解视频 蓝桥杯青少年组第十一届C++全国赛高级组讲解视频_哔哩哔哩_bilibili 蓝桥杯青少年组第十一届C++全国赛高级组讲解视频 蓝桥杯青少年组第十一届 ...

最新文章

  1. NSDate NSCalendar NSString之间的故事以及转换
  2. ubuntu镜像添加jdk_Ubuntu16.0.4安装jdk8
  3. extjs chart无法在panel中显示_手绘风格的 JS 图表库:Chart.xkcd
  4. 51Nod 1050 循环数组最大子段和
  5. 拒绝职场危机,程序员最核心的竞争力是什么?
  6. Rust中mut, , mut的区别
  7. Android 系统(126)---Android的死机、重启问题分析方法
  8. asp.net中日志框架Log4Net的使用
  9. spring session+redis配置
  10. paip.提升性能---mysql 性能 测试以及 参数调整.txt
  11. 9.6 awk(上);9.7 awk(下)
  12. C语言常见编程题及答案40题
  13. java留言板源码_jsp留言板示例源码下载(入门级)
  14. linux 模拟手机浏览器,Firefox模拟手机浏览器(iOS+Android) – UserAgent Switcher使用方法...
  15. android studio中Option + Enter选择了disable 'introduce local variable'
  16. 一位中科院自动化研究所博士毕业论文的致谢
  17. 常见的服务器操作系统和工作站操作系统
  18. 如何在运行窗口快速打开应用软件
  19. 怎么用软件测试睡眠质量差怎么办,睡眠监测 App 到底有没有用?我睡了 34 晚,做了一个实验...
  20. 用虚拟信用卡注册Google Play开发者账号

热门文章

  1. Unity摄像机控制插件移动旋转缩放聚焦自动居中
  2. CSS Grid网格布局详解
  3. 被逼着参加QQ“酷感夏日”活动
  4. java宠物小精灵_简单的Java宠物小精灵战斗模拟器
  5. 英语口语254之每日十句口语
  6. 疯狂动物城中英文字幕文本
  7. 计算机键盘上打分数如何表示,电脑excel中分数怎么打出来(图解excel分数输入法)...
  8. 入门到精通,阿里架构师撰写的两份MySQL技术宝典,已经超神
  9. 数字化时代,阿里云云效如何构建下一代研发协作工具平台?
  10. android禁止录屏功能,react-native(安卓)项目中禁止截屏与录屏