求答案,题目是:用C#编写一个程序,要求求出一个20位数乘以另一个20位数的积,输出结果,谢谢啦,
答案:5 悬赏:40 手机版
解决时间 2021-01-18 18:41
- 提问者网友:轮囘Li巡影
- 2021-01-18 11:41
求答案,题目是:用C#编写一个程序,要求求出一个20位数乘以另一个20位数的积,输出结果,谢谢啦,
最佳答案
- 五星知识达人网友:佘樂
- 2021-01-18 11:56
我写过500 位(十进制500位)以上的两数相乘。
20位都是小意思的,没有必要到这里求结果的!
abstract class DefinedMath
{
private const int SplitNum = 1000000000;
///
/// 一个字符串与一个int32的值相加
///
/// 待加的字符串
/// 要加的值
///相加后的结果
public static string Add(string num1, int num2)
{
if (num1.Length < 10)
return Convert.ToString(Convert.ToInt32(num1) + num2);
//没有以上判断,9位以内的数字会出现错误结果
string result = "";
int numtemp = 0;
while (num1.Length > 9)
{
numtemp = Convert.ToInt32(num1.Substring(num1.Length - 9, 9));
//得到后者数据
num1 = num1.Substring(0, num1.Length - 9);
numtemp += num2;
num2= numtemp / SplitNum;
//CF作进位标志
numtemp %= SplitNum;
result =numtemp.ToString().PadLeft(9,'0') + result;
if (num2 < 1)
break;
}
if (!(num2 > 0))
return num1 + result;
return Convert.ToString(Convert.ToInt32(num1) + num2) + result;
}
/// /// 两个较大的数进行相加
///
/// 相加的两个字符串1
/// 相加的两个字符串2
///返回结果的字符串
public static string Add(string num1,string num2)
{
if (string.IsNullOrEmpty(num2)) return num1;
//为了增强运算速度
if(num2.Length>num1.Length)
{
string swapstring = num2;
num2 = num1;
num1=swapstring;
}
//比较懒了,直接交换一下,省得以后计算谁长谁短
int temp1 =0,temp2=0,CF=0;
string result="";
while(num2.Length>9)
{
temp1 = Convert.ToInt32(num1.Substring(num1.Length-9,9));
num1 = num1.Substring(0,num1.Length-9);
temp2 = Convert.ToInt32(num2.Substring(num2.Length-9,9));
num2 = num2.Substring(0,num2.Length-9);
temp1 += temp2+CF;
CF=temp1/SplitNum;
temp1 %=SplitNum;
result = temp1.ToString().PadLeft(9,'0')+result;
}
return DefinedMath.Add(num1,Convert.ToInt32(num2)+CF)+result;
}
///
/// 一个字符串与一个int的乘法
///
/// 字符串
/// 数值
///返回值
public static string Mult(string num1, int num2)
{
Int64 CF = 0, temp = 0;
string result = "";
while (num1.Length > 9)
{
temp = Convert.ToInt64(num1.Substring(num1.Length - 9, 9)) * num2 + CF;
num1 = num1.Substring(0, num1.Length - 9);
CF = temp / SplitNum;
temp %= SplitNum;
result = temp.ToString().PadLeft(9,'0') + result;
}
return Convert.ToString(Convert.ToInt64(num1) * num2+CF)+result;
}
//传说中的两个超大数乘法,原则上可以任意位相乘
public static string Mult(string num1, string num2) {
if (num2.Length > num1.Length)
{
string swaptemp = num2;
num2 = num1;
num1 = swaptemp;
}
//先交换省心还更省事,用长的乘短的,减速小计算次数(调用次数)
if (num1.Length < 10) return (Convert.ToInt64(num1) * Convert.ToInt64(num2)).ToString();
if (num2.Length < 10)
return DefinedMath.Mult(num1, Convert.ToInt32(num2));
//为增强计算速度,将常用的先进行计算
string result = "", resulttemp = "",multnum="",resultk="";
while (num2.Length > 9)
{
multnum = num2.Substring(num2.Length - 9, 9);
num2 = num2.Substring(0, num2.Length - 9);
resulttemp = DefinedMath.Mult(num1, Convert.ToInt32(multnum));
resulttemp = DefinedMath.Add(resulttemp, resultk);
resultk = resulttemp.Substring(0, resulttemp.Length - 9);
result = resulttemp.Substring(resulttemp.Length - 9, 9)+result;
}
//整下最后一次乘法
resulttemp = DefinedMath.Mult(num1, Convert.ToInt32(num2));
resulttemp = DefinedMath.Add(resulttemp, resultk);
return resulttemp + result;
}
}
这个是编写好的类,你可以直接调用的。如果是要实两个超大数字相乘,可以使用该方法的,这些代码是从我的项目原型中抄给你的,没有优化,比如大量使用string而不是stringbuilder对于几百位的处理上还算可以,如果再多可以考虑使用stringbuilder的方式。
调用时直接使用
string temp = DefinedMath.Mult("13431413413251345324534513544153247895732458973248957","157289435732405732497534890257234890752890347589289");
Consloe.WriteLine(temp);即可!
我测试过一个250位的,时间不到1s,在cmd中最大只能输入255位,你可以多次输入,组成一个新的字符串,然后现进行结果的计算。
20位用这个有点大才小用了!其实ulong是一个64bit的数,它的表示能力已经是20位了,但不保证所有20位都有能力表示,但用可以考虑使用两个ulong进行拆分,就没有必要使用这个了!
20位都是小意思的,没有必要到这里求结果的!
abstract class DefinedMath
{
private const int SplitNum = 1000000000;
///
/// 一个字符串与一个int32的值相加
///
/// 待加的字符串
/// 要加的值
///
public static string Add(string num1, int num2)
{
if (num1.Length < 10)
return Convert.ToString(Convert.ToInt32(num1) + num2);
//没有以上判断,9位以内的数字会出现错误结果
string result = "";
int numtemp = 0;
while (num1.Length > 9)
{
numtemp = Convert.ToInt32(num1.Substring(num1.Length - 9, 9));
//得到后者数据
num1 = num1.Substring(0, num1.Length - 9);
numtemp += num2;
num2= numtemp / SplitNum;
//CF作进位标志
numtemp %= SplitNum;
result =numtemp.ToString().PadLeft(9,'0') + result;
if (num2 < 1)
break;
}
if (!(num2 > 0))
return num1 + result;
return Convert.ToString(Convert.ToInt32(num1) + num2) + result;
}
///
///
/// 相加的两个字符串1
/// 相加的两个字符串2
///
public static string Add(string num1,string num2)
{
if (string.IsNullOrEmpty(num2)) return num1;
//为了增强运算速度
if(num2.Length>num1.Length)
{
string swapstring = num2;
num2 = num1;
num1=swapstring;
}
//比较懒了,直接交换一下,省得以后计算谁长谁短
int temp1 =0,temp2=0,CF=0;
string result="";
while(num2.Length>9)
{
temp1 = Convert.ToInt32(num1.Substring(num1.Length-9,9));
num1 = num1.Substring(0,num1.Length-9);
temp2 = Convert.ToInt32(num2.Substring(num2.Length-9,9));
num2 = num2.Substring(0,num2.Length-9);
temp1 += temp2+CF;
CF=temp1/SplitNum;
temp1 %=SplitNum;
result = temp1.ToString().PadLeft(9,'0')+result;
}
return DefinedMath.Add(num1,Convert.ToInt32(num2)+CF)+result;
}
///
/// 一个字符串与一个int的乘法
///
/// 字符串
/// 数值
///
public static string Mult(string num1, int num2)
{
Int64 CF = 0, temp = 0;
string result = "";
while (num1.Length > 9)
{
temp = Convert.ToInt64(num1.Substring(num1.Length - 9, 9)) * num2 + CF;
num1 = num1.Substring(0, num1.Length - 9);
CF = temp / SplitNum;
temp %= SplitNum;
result = temp.ToString().PadLeft(9,'0') + result;
}
return Convert.ToString(Convert.ToInt64(num1) * num2+CF)+result;
}
//传说中的两个超大数乘法,原则上可以任意位相乘
public static string Mult(string num1, string num2) {
if (num2.Length > num1.Length)
{
string swaptemp = num2;
num2 = num1;
num1 = swaptemp;
}
//先交换省心还更省事,用长的乘短的,减速小计算次数(调用次数)
if (num1.Length < 10) return (Convert.ToInt64(num1) * Convert.ToInt64(num2)).ToString();
if (num2.Length < 10)
return DefinedMath.Mult(num1, Convert.ToInt32(num2));
//为增强计算速度,将常用的先进行计算
string result = "", resulttemp = "",multnum="",resultk="";
while (num2.Length > 9)
{
multnum = num2.Substring(num2.Length - 9, 9);
num2 = num2.Substring(0, num2.Length - 9);
resulttemp = DefinedMath.Mult(num1, Convert.ToInt32(multnum));
resulttemp = DefinedMath.Add(resulttemp, resultk);
resultk = resulttemp.Substring(0, resulttemp.Length - 9);
result = resulttemp.Substring(resulttemp.Length - 9, 9)+result;
}
//整下最后一次乘法
resulttemp = DefinedMath.Mult(num1, Convert.ToInt32(num2));
resulttemp = DefinedMath.Add(resulttemp, resultk);
return resulttemp + result;
}
}
这个是编写好的类,你可以直接调用的。如果是要实两个超大数字相乘,可以使用该方法的,这些代码是从我的项目原型中抄给你的,没有优化,比如大量使用string而不是stringbuilder对于几百位的处理上还算可以,如果再多可以考虑使用stringbuilder的方式。
调用时直接使用
string temp = DefinedMath.Mult("13431413413251345324534513544153247895732458973248957","157289435732405732497534890257234890752890347589289");
Consloe.WriteLine(temp);即可!
我测试过一个250位的,时间不到1s,在cmd中最大只能输入255位,你可以多次输入,组成一个新的字符串,然后现进行结果的计算。
20位用这个有点大才小用了!其实ulong是一个64bit的数,它的表示能力已经是20位了,但不保证所有20位都有能力表示,但用可以考虑使用两个ulong进行拆分,就没有必要使用这个了!
全部回答
- 1楼网友:十年萤火照君眠
- 2021-01-18 14:17
不会。。。。。。。。。。。。。
- 2楼网友:洒脱疯子
- 2021-01-18 13:17
你想说什么?输入两个20位数,然后输出结果??
- 3楼网友:廢物販賣機
- 2021-01-18 13:09
这个并不难,你可以考虑逐位相乘,个位相乘加上十位向乘。。。。。用字符串输出即可。追问可以把这个程序源代码发给我吗,,我纠结好长时间了,就是不对,,谢谢啦,,
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯