CF 13A.Numbers(Java实现)
(这个题,一开始挑战过,但是失败了因为读不懂题,今天再次尝试)
题目分析
输入一个值a,输出一个分子一个分母,分母是a-2,分子是一个累加和,累加的是:a的2至a-1的每一个进制转换后的值的每一位数字和。举例输入5,计算5的2进制,3进制,4进制(2至a-1进制),的每一个值每一位的累加,5的2进制=101,每位相加=2,3进制=12,每位相加=3,同理4进制=11,每位相加2。最后再将这几个值加起来得到分子2+3+2=7。
思路分析
此处我先考虑进制转换函数,Integer.toString(int数字,int转换的进制)。通过for循环遍历2至a-1进制,即Integer.toString(input,i),再累加起来。但是这里忽略了一个问题,10进制过后会出现字母来表达数字。因此我又写了一个方法,不断截取最后一位的字符,如果是字母就又转化为10进制,累加。但是答案最后还是不对,最后选择用进制转化的原理获取值,而不是直接通过封装好的函数获取值。同时这个题目需要约分,所以还需要计算公约数。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();//输入的值
int count=0;//计算累加答案
for (int i = 2; i <= input-1; i++) {//进制区间2至a-1
count+=sum(input,i);//调用sum方法,会按照对应i进制,计算每一位的值并返回累加和
}
int g=gcd(count,input-2);//计算公约数,传入分子分母
System.out.println((count/g)+"/"+((input-2)/g));//输出答案
}
static int gcd(int a,int b){//约分函数(也可以选择欧几里得算法)
int min = a < b ? a : b;//三目运算符判断最小值
for (int i = min; i >= 1; i--) {
if (a % i == 0 && b % i == 0) {//如果这个值能同时被两个数整除就是公约数,第一个出现的就是最大公约数
return i;
}
}
return 0;
}
static int sum(int a,int i){//计算进制转化后的累加和函数
int count=0;//初始化累加值
while (a>0){//a>0时不断截取
count+=a%i;//求余
a/=i;//截取
}
return count;//返回累加值
}
}
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。