您的位置:首页 > 编程语言 > C#

c#大数相乘

2009-06-21 11:13 232 查看
using System;

using System.Collections.Generic;

using System.Text;

namespace Numbers

{

public class Number

{

public static bool IsInteger(string valueStr)

{

char[] ch1 = valueStr.ToCharArray();

foreach (char t in ch1)

{

if (!char.IsDigit(t)) return false;

}

if (ch1.Length == 0) return true;

return true;

}

public static string GetMutipul(string strFirst, string strSec)

{

if (!IsInteger(strFirst) || !IsInteger(strSec)) return "Not a number!";

char[] m1 = strFirst.Trim().ToCharArray();

char[] m2 = strSec.Trim().ToCharArray();

int[] arr1 = new int[m1.Length];

int[] arr2 = new int[m2.Length];

GetDigit(m1, m2, arr1, arr2);

return Mutipul(arr1, arr2);

}

public static string Mutipul(int[] intFirst, int[] intSecond)

{

int[] result = new int[intFirst.Length + intSecond.Length];

int pre = 0;

int curr = 0;

int start = 0;

string str = "";

for (int i = 0; i < result.Length; i++)

{

result[i] = 0;

}

for (int i = intFirst.Length - 1; i >= 0; i--)

{

pre = 0;

curr = 0;

start = intFirst.Length - 1 - i;

for (int j = intSecond.Length - 1; j >= 0; j--)

{

curr = intFirst[i] * intSecond[j] + result[start] + pre;

result[start] = curr % 10;

pre = (curr - curr % 10) / 10;

start = start + 1;

}

if (pre != 0)

{

result[start] = pre;

}

}

if (result[start] == 0) start = start - 1;

for (int j = start; j >= 0; j--)

{

str += result[j] + "";

}

return str;

}

public static void GetDigit(char[] chFirst, char[] chSecond, int[] intFirst, int[] intSecond)

{

for (int i = 0; i < chFirst.Length; i++)

{

intFirst[i] = chFirst[i] - '0';

}

for (int i = 0; i < chSecond.Length; i++)

{

intSecond[i] = chSecond[i] - '0';

}

}

public static string GetMinTwo(string First, string Second)

{

if (!IsInteger(First) || !IsInteger(Second)) return "Not a number!";

char[] m1 = First.Trim().ToCharArray();

char[] m2 = Second.Trim().ToCharArray();

int[] arr1 = new int[m1.Length];

int[] arr2 = new int[m2.Length];

if (First.Trim() == Second.Trim()) return "0";

GetDigit(m1, m2, arr1, arr2);

bool flag = IsPos(arr1, arr2);

if (!flag) return ("-"+MinTwo(arr2,arr1));

else return MinTwo(arr1, arr2);

}

public static bool IsPos(int[] arr1, int[] arr2)

{

int len1=arr1.Length;

int len2=arr2.Length;

if (len1 > len2) return true;

else if (len1 < len2) return false;

else {

for (int i = 0; i <len1; i++)

{

if (arr1[i] > arr2[i]) return true;

else if (arr1[i] < arr2[i]) return false;

}

return true;

}

}

public static string MinTwo(int[] intFirst, int[] intSec)

{

int pre = 0;

string str = "";

int[] result=intFirst;

int pos = 0;

for (int i = intSec.Length - 1,j=intFirst.Length-1; i >= 0; j--,i--)

{

pos = j;

if (intFirst[j] - pre >= intSec[i])

{

result[j] = intFirst[j] - intSec[i];

pre = 0;

}

else {

result[j] = intFirst[j] - intSec[i]+10-pre;

pre = 1;

}

}

if (pre != 0)

{

for (int j = pos; j >= 0; j--)

{

if (result[j] - pre >= 0) { result[j] = result[j] - pre; break; }

}

}

bool flag=true;

foreach (int t in result)

{

if(flag){

if (t != 0) {

str += t;

flag = false;

}

}

else str += t;

}

return str;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: