(Java)有若干大数,需要对其进行求和操作。
输入格式
每行输入一个字符串,当输入e或者E的时候退出。
输入样例:
42846280183517070527831839425882145521227251250327
55121603546981200581762165212827652751691296897789
输出样例:
97967883730498271109594004638709798272918548148116
好像没啥难度,用一个数组放加数,一个数组放被加数,一个变量放进位数,一个数组放结果。你的问题是什么?你不会一点思路都没有吧?
会长看题目,认真审题
您写一下。。
@岚小叶: 你把想做的功能说一下
@220✈: E退出那里代码怎么实现的呀
@岚小叶: 判断啊
@岚小叶: 是控制台程序吗?
@岚小叶: 没有Java环境,用C#写了一个:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PlusProgram
{
class Program
{
static void Main(string[] args)
{
List<char> firstNumber = ReadNumber("first number(ends with 'E' or 'e'):");
List<char> secondNumber = ReadNumber("second number(ends with 'E' or 'e'):");
string result = Plus(firstNumber, secondNumber);
Console.WriteLine();
Console.WriteLine($"it's {result}");
Console.ReadLine();
}
private static List<char> ReadNumber(string name)
{
Console.WriteLine();
Console.WriteLine(name);
List<char> charList = new List<char>();
ConsoleKeyInfo? keyinfo = null;
while (true)
{
keyinfo = Console.ReadKey();
if (keyinfo.Value.KeyChar >= 48 && keyinfo.Value.KeyChar <= 57)
{
charList.Add(keyinfo.Value.KeyChar);
}
else if (keyinfo.Value.Key == ConsoleKey.E)
{
if (charList.Count > 0)
{
break;
}
else
{
Console.WriteLine();
Console.WriteLine("you input nothing, please try again");
}
}
else
{
Console.WriteLine();
Console.WriteLine("please input only a number(0---9)");
charList.Clear();
}
}
return charList;
}
private static string Plus(List<char> firstNumber, List<char> secondNumber)
{
List<char> result = new List<char>();
int carry = 0;
var bigList = firstNumber.Count >= secondNumber.Count ? firstNumber : secondNumber;
var smallList = secondNumber.Count <= firstNumber.Count ? secondNumber : firstNumber;
var bigListIndex = bigList.Count - 1;
var smallListIndex = smallList.Count - 1;
while (bigListIndex >= 0)
{
var bitPlus = (bigList[bigListIndex] - 48) + (smallListIndex < 0 ? 0 : (smallList[smallListIndex] - 48)) + carry;
if (bitPlus > 9)
{
carry = 1;
result.Insert(0, char.Parse((bitPlus % 10).ToString()));
}
else
{
carry = 0;
result.Insert(0, char.Parse(bitPlus.ToString()));
}
bigListIndex--;
smallListIndex--;
}
if (carry == 1)
{
result.Insert(0, char.Parse(carry.ToString()));
}
StringBuilder sb = new StringBuilder();
foreach (var item in result)
{
sb.Append(item);
}
return sb.ToString();
}
}
}
我真疯了,花了一个小时写这个。以后可不回答初学者的题目了。
@会长: 看来需要提高哈哈哈,写这个竟然用1小时。但是不会c#。哈哈哈哈
@不知怎么办才好: 主要是考虑了些输错的情况,比如不是数字,还有直接输入E,你处理了?我确实对char类型的掌握不够好
@不知怎么办才好: 你写的不错
@会长: 没有哈哈哈。我感觉这是一个类似于leetcode的题,应该没有非法输入。所以没处理非法输入。而且我也没处理负数的情况(不知道会不会出现)
@不知怎么办才好: cow,我没考虑负数,如果输入负号就提醒重新输入,哈哈哈
@会长: 我感觉给个思路就行了。剩下的让楼主来
@不知怎么办才好: 我已经说思路了,但是楼主嘲讽我,说“您写一下。。”,我以后不再回答这样的问题了。
啊哈哈,我没有嘲讽的意思啊,我是个学生,编程能力比较差,真的只是想让你写一下代码让我参照一下。。
闲来无事写的,没有仔细测试;提供一个思路,可以自己写。而且只是写的加法,没有考虑减法。其实减法一个道理。
import java.util.Scanner; public class BigNumAdd { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String result = ""; // 存储结果 String num1 = "0"; // 初始化第一个数值 String num2 = ""; // 存储输入的数值 // 未输入e的时候持续输入 while (!(num2 = sc.nextLine()).equalsIgnoreCase("e")) { result = add(num1.toCharArray(), num2.toCharArray()); num1 = result; } System.out.println(result); } private static String add(char[] num1s, char[] num2s) { int[] num1 = charToInt(num1s); int[] num2 = charToInt(num2s); int len1 = num1.length; int len2 = num2.length; int[] sum = new int[Math.max(len1, len2) + 1]; int flag = 0; int n1 = len1 - 1, n2 = len2 - 1, s = sum.length - 1; while (n1 >= 0 && n2 >= 0) { int tmp = num1[n1--] + num2[n2--] + flag; if (tmp >= 10) { tmp = tmp % 10; flag = 1; } else { flag = 0; } sum[s--] = tmp; } while (n1 >= 0) { sum[s--] = num1[n1--]; } while (n2 >= 0) { sum[s--] = num2[n2--]; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < sum.length; i++) { if (i == 0 && sum[i] == 0) { continue; } sb.append(sum[i]); } return sb.toString(); } private static int[] charToInt(char[] chs) { int[] res = new int[chs.length]; for (int i = 0, len = chs.length; i < len; i++) { res[i] = chs[i] - '0'; } return res; } }
结果:
你的问题是当用户输入E或e的时候退出输入吗
– 220✈ 5年前楼主,对于代码满意不,采纳一下哈 哈哈哈哈
– 不知怎么办才好 5年前