【JAVA】PAT 乙级 1017 A除以B

【JAVA】PAT 乙级 1017 A除以B


题目链接
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。

输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。

输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。

输入样例:
123456789050987654321 7

输出样例:
17636684150141093474 3

本题是一道模拟题,模拟算除法的过程,因为输入很大,会超过long的范围,所以不能直接除,JAVA虽然有一个BigInteger类,专门用来处理大数,但是会超时,我一开始就是用BigInteger结果超时了。

当然你也可以选择用Python来写

ip=input().split(" ")
a=int(ip[0])
b=int(ip[1])
Q=a//b
R=a%b
print("{0} {1}".format(Q,R))

要是用JAVA的话就得模拟除法的过程,可以在纸上列竖式一步步看看是怎么算的。
这里要注意的是被除数的第一位数字(假设是t从左往右数),如果t>b,商Q的第一位就是t/b,余数R等于t%b,否则的话商Q先不用管,余数R等于t。
接下来从被除数的第二位开始,一位一位处理,每一次循环的被除数tem=tem = r * 10 + t ,每次循环Q加上tem/b(这个是附加的意思,不是四则运算的加),余数每次循环都等于tem%b

JAVA代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main{
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		String[] ab = bf.readLine().split(" ");
		int b = sti(ab[1]);
		String q = "";//商
		String a = ab[0];//用String储存被除数
		if (a.length() == 1) {
		//被除数只有一位的情况下
			int tem = sti(a);
			out.println(tem / b + " " + tem % b);
		} else {
			int r = a.charAt(0) - '0';//余数
			char t = a.charAt(0);//首位数字
			if ((t - '0') > b) {
				//首位数字比b大
				//商q为t/b
				//余数r为t%b
				q = (t - '0') / b+"";
				r = (t - '0') % b;
			} 
			for (int i = 1; i < a.length(); i++) {
				t = a.charAt(i);
				int tem = r * 10 + t - '0';
				q += tem / b;
				r = tem % b;
			}
			out.println(q + " " + r);
		}
		out.flush();

	}

	static int sti(String a) {
		return Integer.parseInt(a);
	}
}
### 关于 PAT 乙级考试第 1017 题的 Java 编程解决方案 PAT (Programming Ability Test) 是一项旨在评估编程能力的测试。对于题目编号为 B1017 的问题,该题通常涉及字符串处理以及简单的算法逻辑。 #### 解析与思路 此题的核心在于理解给定条件并按照指定规则转换字符串。具体来说,需要遍历输入字符串中的每一个字符,并依据特定映射关系将其替换为目标字符[^1]。 #### 示例代码实现 下面是一个基于上述解析编写的 Java 实现: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String inputString = scanner.nextLine(); StringBuilder resultBuilder = new StringBuilder(); for (char c : inputString.toCharArray()) { if ('A' <= c && c <= 'Z') { // 大写字母转成小写对应字母后的那个字母 char nextChar = (char)((c - 'A' + 1) % 26 + 'a'); resultBuilder.append(nextChar); } else if ('a' <= c && c <= 'z'){// 小写字母变成大写对应的前一个字母 char prevChar = (char)(((c - 'a' - 1 + 26) % 26) + 'A'); resultBuilder.append(prevChar); }else{ resultBuilder.append(c); // 不改变其他字符 } } System.out.println(resultBuilder.toString()); scanner.close(); } } ``` 这段程序读取一行标准输入作为待处理字符串,逐个检查其中每个字符是否属于英文字母范围;如果是,则按题目描述的方式做相应变换;最后输出经过处理的新字符串。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值