+ -
当前位置:首页 → 问答吧 → 请教长整数 x 长整数 Code

请教长整数 x 长整数 Code

时间:2014-04-11

来源:互联网

请教如何精确地计算出一个稍长的整数 乘於 另一整数, 并精算地计出答案

请输入第一数 : 1230981204973453434534510732

请输入第二数 : 64569845695683295334534534534586

关於 1230981204973453434534510732 x 64569845695683295334534534534586

= 79484266459422178553419202408729802785262572401684842176952

最好 Java Code, 甚他 code 都 okay la.

Thank you!

作者: me888   发布时间: 2014-04-11

用convolution

作者: Susan﹏汪汪   发布时间: 2014-04-11

哈哈!你嘅C++ 太强啦, 好难明 请问声你最近那些code ,directx,direct sound 在写紧game 吗?

作者: me888   发布时间: 2014-04-11

引用:原帖由 me888 於 2014-4-1 12:31 PM 发表
哈哈!你嘅C++ 太强啦, 好难明 请问声你最近那些code ,directx,direct sound 在写紧game 吗?



汪汪写左个javascript版
http://www.discuss.com.hk/viewthread.php?tid=23105431

作者: Susan﹏汪汪   发布时间: 2014-04-11

引用:原帖由 me888 於 2014-4-1 12:31 PM 发表
哈哈!你嘅C++ 太强啦, 好难明 请问声你最近那些code ,directx,direct sound 在写紧game 吗?



果D directx只系玩下

作者: Susan﹏汪汪   发布时间: 2014-04-11

哈哈!我啲旧人脱晒节啦,未学过OO. 要睇多些Tutorial恶补一下,我谂紧将现成旧code转成新Java code. string input 再转数字,开 array 来计,嘻嘻,只作练习一下Java .BTW, 你嘅 JavaScript 都好强。读紧HKU CS 吗?

[ 本帖最后由 me888 於 2014-4-1 12:48 PM 使用 编辑 ]

作者: me888   发布时间: 2014-04-11

引用:原帖由 me888 於 2014-4-1 12:47 PM 发表
哈哈!我啲旧人脱晒节啦,未学过OO. 要睇多些Tutorial恶补一下,我谂紧将现成旧code转成新Java code. string input 再转数字,开 array 来计,嘻嘻,只作练习一下Java .BTW, 你嘅 JavaScript 都好强。读 ...
冇读大学

作者: Susan﹏汪汪   发布时间: 2014-04-11

作者: me888   发布时间: 2014-04-11

不过长整数仲有另一种算法

例如有个function
可以把a和b变成
a1*base + a2
b1*base + b2
咁a * b = a1*b1*base^2 + (a1*b2 + b1*a2)*base + a2*b2

所以例如整数乘法
123456*789012
可以分拆成Array[123, 456]和Array[789, 12]
咁最终得出Array[123*789, 123*12 + 789*456, 456*12]
处理埋进位就完成

当然个base不一定系10^3
可以系任何数、例如电脑用二进制比较方便

如果太长的数字、就可以用recursion
以上算法理论上都系convolution的精简版

作者: Susan﹏汪汪   发布时间: 2014-04-11

523965162807220940073251636256483299415450662932889496 * 751398048872650908679067085323545218618581250338773548
= 393706401010586690115662934726040569292560532967393351007671615018540042650653437089304125648277060451851808

汪汪的算法计出来

作者: Susan﹏汪汪   发布时间: 2014-04-11

嘻嘻,JavaScript 劲过 Java code 好多,二种code 完全唔同

作者: me888   发布时间: 2014-04-11

引用:原帖由 me888 於 2014-4-1 11:05 AM 发表
请教如何精确地计算出一个稍长的整数 乘於 另一整数, 并精算地计出答案

请输入第一数 : 1230981204973453434534510732

请输入第二数 : 64569845695683295334534534534586

关於 123098120497345343453451073 ...
好似 Python 及 Ruby 本身直接可计任意长度的 integer 运算。
不过唔知点解用 http://repl.it/languages/Ruby 及 http://repl.it/languages/Python
分别计得
79484266459422178556481743541786893846643118876806624731136 及 79484266459422178553419202408729802785262572401684842176952 。
应该是前者错了。

作者: xianrenb   发布时间: 2014-04-11

因为是新手, 所以只能看看人家的作品, 请见谅 .
复制内容到剪贴板代码:
import java.util.Scanner;

public class Multiply
{
public String mul(String str1,String str2)
{
StringBuffer bstr=new StringBuffer();
int i=0,j=0;
for(i=0;i<str1.length()+str2.length();i++)
{
bstr.append('0');
}
int k=bstr.length()-1,add=0,temp=0;
for(j=str2.length()-1;j>=0;j--)
{
if(str2.charAt(j)!='0')
{
for(i=str1.length()-1;i>=0;i--)
{
k=i+j+1;
temp=(str2.charAt(j)-'0')*(str1.charAt(i)-'0')+(bstr.charAt(k)-'0');
bstr.setCharAt(k--, (char)('0'+temp%10));
add=temp/10;
while(add!=0)
{
temp=add+bstr.charAt(k)-'0';
bstr.setCharAt(k--, (char)('0'+temp%10));
add=temp/10;
}
}
}
}
return bstr.substring(firstNotZeroIndex(bstr));
}

private int firstNotZeroIndex(StringBuffer str)
{
for(int i=0;i<str.length();i++)
if(str.charAt(i)!='0')
return i;
return str.length()-1;
}

public static void main(String[] args)
{
Multiply mul=new Multiply();
Scanner cin=new Scanner(System.in);
System.out.print("请输入第一个整数:");
String str1=cin.next();
System.out.print("请输入第二个整数:");
String str2=cin.next();
System.out.print("结果是:");
System.out.println(mul.mul(str1, str2));
}
}

作者: me888   发布时间: 2014-04-11

哗! 现在的Program 连 IDE 都唔晒, 直接用网页 load 出来, Python 的 Longint 真系好劲, 咁长的数位都计到.

[ 本帖最后由 me888 於 2014-4-2 11:36 AM 编辑 ]

作者: me888   发布时间: 2014-04-11

javascript:
复制内容到剪贴板代码:<html>
<head>
<script>
function cal(n1,n2){
var len1=n1.length,
len2=n2.length;
var result=new Array(len1+len2);
for (var i=0;i<result.length;i++) {
result[i]=0;
}
for (var i=0;i<len1;i++){
for (var j=0;j<len2;j++){
result[j+i+1]+=n1[i]*n2[j];
}
}

i=result.length;
while (--i) {
if (result[i]>10){
result[i-1]+=Math.floor(result[i]/10);
result[i]=result[i]%10;
}
}
if (result[0]==0) result.shift();
return result.join("");
}
var N1,N2,result;
window.onload=function(){
N1=document.getElementById("N1");
N2=document.getElementById("N2");
result=document.getElementById("result");
}
</script>
</head>
<body>
<input id="N1" style="width:50ex"/><br/>
<input id="N2" style="width:50ex"/>
<button onclick="result.value=cal(N1.value,N2.value)">cal</button><br/>
<input id="result" style="width:100ex"/>

</body>
</html>



[ 本帖最后由 slight 於 2014-4-2 04:38 PM 编辑 ]

作者: slight   发布时间: 2014-04-11

How about java.math.BigInteger?

作者: 天会穴   发布时间: 2014-04-11

热门下载

更多