目录
题目2、立方变自身
题目描述
观察下面的现象,某个数字的立方,按位累加仍然等于自身。
1^3 = 1
8^3 = 512 5+1+2=8
17^3 = 4913 4+9+1+3=17
…请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?
请填写该数字,不要填写任何多余的内容或说明性的文字。
package 往年例题.省赛模拟题.模拟题2;
/**
* @author diao 2022/3/24
*/
public class 立方数 {
static int count=0;
public static void main(String[] args) {
for(long i=1;i<=10000;i++){
//因为有大数模拟,所以我们这里用long模拟
long temp=i*i*i;
//进行按位取数,弄一个变量储存所有不同位上的数之和
long temp1=0;
while(temp>0){
temp1+=temp%10;
temp/=10;
}
if(i==temp1){
System.out.println("i="+i+",立方和为:"+(i*i*i));
count++;
}
}
System.out.println(count);
}
}
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
package 往年例题.省赛模拟题.模拟题2;
/**
* @author diao 2022/3/24
*/
public class 三羊献瑞 {
/**
* 根据条件得到一些特定值,然后利用循环不断缩小范围
* @param args
*/
public static void main(String[] args) {
//e:1 a:9 f:0 c=b+1 c+g>10,数之间各不相同
for(int b=2;b<9;b++){
for(int d=2;d<9;d++){
//进行条件判断,如果两数出现相同就跳至下一个循环
if(b==d) continue;
for(int g=2;g<9;g++){
if(g==b||g==d) continue;
int c=b+1;
if(c==b||c==d||c==g) continue;
if(c+g<=10) continue;
//因为aef已经确定值了就不需要在循环了
/**
* 根据两个数的加法得到值建立等式
*/
int start_end=9000+b*100+(b+1)*10+d+1000+g*10+b;
//因为出现了i也就是一个新的文字,用i表示,再for一次
for(int i=2;i<9;i++){
if(i==b||i==d||i==g||i==c) continue;
if(start_end<=(10000+c*100+b*10+i)&&start_end>=(10000+c*100+b*10+i)){
System.out.printf("%d%d%d%d",9,b,c,d);
System.out.println();
System.out.printf("%d%d%d%d",1,0,g,b);
System.out.println();
System.out.printf("%d",start_end);
}
}
}
}
}
}
}
循环节问题
package 往年例题.省赛模拟题.模拟题2;
import java.util.ArrayList;
/**
* @author diao 2022/3/24
*/
public class 循环节问题 {
public static void main(String[] args) {
int remainder = getRemainder(11, 13);
System.out.println(remainder);
}
/**
* 取循环小数的重复数
* @param n:除数
* @param m:被除数
* @return
*/
public static int getRemainder(int n,int m){
n%=m;
ArrayList list = new ArrayList();
for(;;){
list.add(n);
n*=10;
n%=m;
if(n==0) return 0;
//indexOf(n)就是n这个数的索引,一般用于去重,最后一次出现得到话是lastIndex
if(list.indexOf(n)>=0) return list.size();
}
}
public static int f(int n,int m){
//第一个小数
n%=m;
//1.创建一个集合,放入每个小数
ArrayList list = new ArrayList();
for(;;){
//2.添加完这一个小数之后
list.add(n);
//3.n*10,继续%m得到下一个小数
n*=10;
n%=m;
//4.结束条件
if(list.size()<=0) return 0;
//这里注意:indexOf()就是第一次出现的索引位置,如果说出现的位置不是1le,就返回集合大小
if(list.indexOf(n)>0) return list.size();
}
}
}
题目7、牌型整数
题目描述
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?请填写该整数,不要填写任何多余的内容或说明文字。
package 往年例题.省赛模拟题.模拟题2;
/**
* @author diao 2022/3/24
*/
public class 递归实现发牌问题 {
static int sum=0;
static int count=0;
public static void main(String[] args) {
f(0);
System.out.println(count);
f1(0);
System.out.println(0);
}
/**
* sum:取牌数量,n代表取牌的数字是?(0-12)
* @param n
*/
public static void f(int n){
//1.结束条件
if(sum>13||n>13) return;
if(sum==13){
//取牌数满了,种类+1
count++;
return;
}
/**理解:和全排列类似
* 首先取第一种牌取一张,然后递归到第二种
* 第二种再来一张...直到所有种类都来了一张,也就是牌满了13张f(13),结束
* 开始回溯
* f(12)....直到f(0)
*/
//2.递归思维
for(int i=0;i<=4;i++){
//0-4代表有五种取法,因为每种牌都有五种取法(0-4张)
sum+=i;
f(n+1);
//3.回溯,因为我可以不取那一张,我可以一下取两张
sum-=i;
}
}
public static void f1(int n) { // sum是取牌的数量,n是取得牌的数字是几。这里n的范围是0到12.
if(sum>13 || n>13) return ; //sum>13表示牌取多了。n>13表示一共13种牌,不可能取到第14种。
if(sum==13 ) { //只有当取牌的数量达到13张的时候,表示这次可行。
count++;
return;
}
for(int i=0; i<=4; i++) { //从0到4,一共5种取法,因为有的牌可以一张不取。
sum += i;
f(n+1);
sum -= i; //回溯回去,比如上次取了一张,先减去那一张,这次可以取两张。
}
}
}
题8、饮料换购目
饮料换购乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能得到多少瓶饮料。
输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
输出:一个整数,表示实际得到的饮料数
package 往年例题.省赛模拟题.模拟题2;
/**
* @author diao 2022/3/24
*/
/**三个瓶盖换一瓶饮料,问一下买n瓶饮料可以得到多少瓶饮料
*
*/
public class 饮料换购 {
public static void main(String[] args) {
int cal = cal(3);
System.out.println(cal);
}
public static int cal(int n){
//1.首先特殊情况
if(n==0||n==1||n==2){
return n;
}
//2.当大于2时
int temp=n;
while(n>2){
//temp=饮料+瓶盖兑换的饮料
temp+=n/3;
//更新瓶盖数,兑换的饮料的瓶盖数
n=n/3+n%3;
}
return temp;
}
public static int cal1(int n){
while(n>2){
n-=3;
n++;
}
return n;
}
}