我在c#里使用Int64,UInt64进行两个整数的相加都会出现溢出,请问有什么办法可以解决
如果有字符串可以解决,怎么解决
如果有字符串可以解决,怎么解决
解决方案 »
- C# DataGridViewColum
- EXCEPTION:ora-01008:not all variable bound--求解
- 很基本的显示,却半天出不来,,,,
- 请问c#2.0里关于IAnsycResult的问题
- C#里面能不能自动调整SOURCE的格式,比如缩进,空格等
- DataSet合并问题
- C# 如何中ffmpeg将指定文件夹中的图片转换为视频
- 关于sql和vs的问题 附加数据库的时候说已经被使用 可是数据库列表里没有这个数据库的名字 打开vs的时候还可以连接到这个数据库 我怎么中断它 重新附加?
- 初学者的困惑:sql 语句中参数传递问题,谢谢!一个极简单的问题!
- 行业套件包/套件解决方案架构实现方案
- dll文件的网站发布问题?????
- 关于C#和数据库连接的问题
{
int a=str1.Length;
int b=str2.Length;
int[] it;
if(a>b)
{
it=new int[a+1];
for(int i=0;i<it.Length;i++)
{
it[i]=0;
}
int j=b-1;
for(int i=a-1;i>=0;i--)
{
int x=int.Parse(str1[i].ToString());
int y=0;
if(j>=0)
{
y=int.Parse(str2[j].ToString());
}
it[i+1]=x+y;
j--;
}
}
else
{
it=new int[b+1];
for(int i=0;i<it.Length;i++)
{
it[i]=0;
}
int j=a-1;
for(int i=b-1;i>=0;i--)
{
int x=int.Parse(str2[i].ToString());
int y=0;
if(j>=0)
{
y=int.Parse(str1[j].ToString());
}
it[i+1]=x+y;
j--;
}
}
string returnValue=string.Empty;
for(int i=it.Length-1;i>0;i--)
{
if(it[i]>=10)
{
int m=it[i]%10;
int n=it[i]/10;
it[i]=m;
it[i-1]=n+it[i-1];
}
returnValue=it[i].ToString()+returnValue;
}
if(it[0]!=0)
{
returnValue=it[0]+returnValue;
}
return returnValue;
}
private string Keisan(string str1,string str2)
{
int a=str1.Length;
int b=str2.Length;
int[] it=new int[a+b];
for(int i=0;i<it.Length;i++)
{
it[i]=0;
}
int[] aa=new int[a];
int[] bb=new int[b];
for(int i=0;i<a;i++)
{
aa[i]=int.Parse(str1[i].ToString());
}
for(int i=0;i<b;i++)
{
bb[i]=int.Parse(str2[i].ToString());
} for(int i=a-1;i>=0;i--)
{
for(int j=b-1;j>=0;j--)
{
it[i+j+1]=it[i+j+1]+aa[i]*bb[j];
}
} StringBuilder returnValue = new StringBuilder("");
for(int i=a+b-1;i>0;i--)
{
if(it[i]>=10)
{
int m=it[i]%10;
int n=it[i]/10;
it[i]=m;
it[i-1]=n+it[i-1];
}
returnValue.Insert(0,it[i].ToString());
}
if(it[0]!=0)
{
returnValue.Insert(0,it[0]);
} return returnValue.ToString();
}
{
static void Main(string[] args)
{
Int64 numA = 1234560000000000;
UInt64 numB = 987654320000000000; string strNumA = Fun(numA.ToString());
string strNumB = Fun(numB.ToString());
string ans = "";
int flag = 0;
if (strNumA.Length < strNumB.Length)
{
for (int i = 0;i < strNumB.Length ; i++)
{
int temp = 0;
if (i < strNumA.Length)
temp = Int32.Parse(strNumA[i].ToString()) + Int32.Parse(strNumB[i].ToString());
else
temp = Int32.Parse(strNumB[i].ToString());
temp += flag;
flag = 0;
if (temp > 9)
{
temp = temp % 10;
flag = 1;
}
ans += temp.ToString();
}
}
Console.WriteLine(Fun(ans));
Console.Read();
} static string Fun(string str)
{
string newString = "";
for (int i = str.Length - 1; i >= 0; i--)
{
newString += str[i].ToString();
}
return newString;
}
}
class Program
{
static void Main(string[] args)
{
Int64 numA = -1;
UInt64 numB = 1234560000000000; string strNumA = Fun(numA.ToString());
string strNumB = Fun(numB.ToString());
int sign = 0;
if (strNumA[strNumA.Length - 1].ToString() == "-")
sign = -1;
else
sign = 1;
strNumA = strNumA.Replace("-", ""); Console.WriteLine(Fun(GetSum(strNumA, strNumB, sign)));
Console.Read();
} static string Fun(string str)
{
string newString = "";
for (int i = str.Length - 1; i >= 0; i--)
{
newString += str[i].ToString();
}
return newString;
} static string GetSum(string strNumA, string strNumB, int sign)
{
string ans = "";
int flag = 0;
if (strNumA.Length > strNumB.Length)
{
string strTemp = strNumA;
strNumA = strNumB;
strNumB = strTemp;
} for (int i = 0; i < strNumB.Length; i++)
{
int temp = 0;
if (i < strNumA.Length)
temp = sign * Int32.Parse(strNumA[i].ToString()) + Int32.Parse(strNumB[i].ToString());
else
temp = Int32.Parse(strNumB[i].ToString());
temp += flag;
flag = 0;
if (temp > 9)
{
flag = 1;
}
if (temp < 0)
{
temp = temp + 10;
flag = -1;
}
temp = temp % 10;
ans += temp.ToString();
}
return ans;
}
} 之前的代码只考虑了Int64的数比UInt64的数小的情况,也没考虑Int64的数小于0的情况,汗自己一个
先声明类型再相加long a = 345466;
long b = 456456;
long c = a + b;不要long c = 345466 + 456456;
因为编译器会把345466 + 456456编译成int a = 345466;
a += 456456;所以会溢出
/// 将字符串转换成整型数组
/// </summary>
/// <param name="A"></param>
/// <returns></returns>
int[] ConvertStrToArray(string A)
{
int[] str=new int[A.Length]; for (int i = 0; i < A.Length; i++)
{
str[i] = Convert.ToInt32(A.Substring(A.Length - 1 - i, 1));
}
return str;
} /// <summary>
/// 将整型数组转换成字符串
/// </summary>
/// <param name="A"></param>
/// <returns></returns>
string ConvertArrayToStr(int[] A)
{
int length = 0; if (builder == null)
builder = new StringBuilder(); builder.Remove(0,builder.ToString().Length); length = A.Length - (A[A.Length - 1] != 0 ? 0 : 1); for (int i = length; i > 0; i--)
builder.Append(A[i - 1].ToString()); return builder.ToString();
} /// <summary>
/// 两个字符串相加
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
/// <returns></returns>
string OperationAdd(string A, string B)
{
int[] strA = ConvertStrToArray(A); int[] strB = ConvertStrToArray(B); int[] newStr = new int[Math.Max(A.Length, B.Length) + 1]; int i, rem = 0; bool incFl; for (i = 0; i <newStr.Length; i++)
{
newStr[i] = (strA.Length > i ? strA[i] : 0);
} for (i = 0; i < strB.Length; i++)
{
if (newStr[i] + strB[i] + rem >= 10)
{
newStr[i]+=strB[i] + rem - 10;
rem = 1;
}
else
{
newStr[i] += strB[i] + rem;
rem = 0;
}
} /*判断最后一位是否要进一位*/
while (rem == 1)
{
incFl = (newStr[i] == 9);
newStr[i++] += (incFl ? -9 : 1);
rem = (incFl ? 1 : 0);
} return ConvertArrayToStr(newStr);
}