当前位置: 首页 > article >正文

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;//返回累加值
	}
}

        感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。


http://www.kler.cn/a/559381.html

相关文章:

  • nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典
  • 常用的性能优化方法和技巧
  • 在Spring Boot中如何使用Freemaker模板引擎
  • Cocos Creator Shader入门实战(一):材质和Effect的了解
  • docker容器网络配置及常用操作
  • 如果二者隔离级别不一致,以哪个为主。例如@Transactional 隔离级别是RC,mysql是RR
  • FunAudioLLM:用语音大模型解锁智能语音交互的无限可能
  • 第六届全球数据库大赛:PolarDB TPC-C性能优化挑战赛方案分享(一)--参数调优
  • Linux相关概念和易错知识点(30)(线程互斥、线程同步)
  • SQLMesh 系列教程8- 详解 seed 模型
  • C#贪心算法
  • 第六次作业
  • HTTP实验(ENSP模拟器实现)
  • C语言基础之【函数】
  • docker下安装 es 设置账号密码
  • 使用 Grafana 监控 Spring Boot 应用
  • 离子阱量子计算机的原理与应用:开辟量子计算的新天地
  • 分布式服务注册与发现
  • Maxscript血管网络分形的算法实现
  • Golang学习笔记_36——装饰器模式