First
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。
从n开始倒推,在两个魔法机器之间选择,期间一直保持为整数,直到n==0,得出的魔法机器字符标记存入数组,此时的顺序为逆序,输出时需要逆置.
#include<stdio.h>
int fun1(int x){
int t=(x-1)/2;
if((x-1)%2==0)
return t;
else return -1;
}
int fun2(int x){
int t=(x-2)/2;
if((x-2)%2==0)
return t;
else return -1;
}
int main(){
int need;
int i=0;
int j;
scanf("%d",&need);
char str[30];
while(need){
if(fun1(need)!=-1){
need=fun1(need);
str[i++]='1';
}
else if(fun2(need)!=-1){
need=fun2(need);
str[i++]='2';
}
}
for(j=i-1;j>=0;j--){
printf("%c",str[j]);
}
}
Second
为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325的"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1.
此处为正整数的逆置
#include<stdio.h>
int main(){
int num;
int r=0;
scanf("%d",&num);
int f=num;
while(num){
r=r*10+num%10;
num=num/10;
}
printf("%d",(r+f));
}
Third
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。
DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字放在这个位置。
import java.util.Scanner;
import java.text.DecimalFormat;
public class Main{
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
float n=1;
for(int i=1;i<str.length();i++){
if(str.charAt(i)!=str.charAt(i-1)){
n++;
}
}
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(str.length()/n));
}
}