在c#中两个很大的数字相加计算

2025-06-20 20:44:07
推荐回答(2个)
回答1:

只给思路,你看行不行一般都是用数组来计算,用string就比较麻烦,需要拆,还需要重组不管是不是用C++,其实方法都一样,利用数组比如说长度为一千的数字,可以这个 int[] number1 = new int[1000]; int[] number2 = new int[1000];相加的思路是,首先两个数组的长度必须是一致,位数不同的话,前面补0,内存有点浪费,但是计算起来比较方便。然后让它们从0到最高位,每位进行相加并保存相应的位置上。最后一步是从0开始判断有没有大于10的数字,如果有就向前面进位(前一个加1,当前位减10),这样就可以。在计算前面所需要做的事情呢,就是把输入的数据转为数组形式就可以了,在高质量程序设计时做得蛮多的,不过现在具体的想不起了,嘿嘿。靠你自己解决了文字比较多,特别是中间那一段,看仔细咯,先加再进位

回答2:

我给你个思路吧,保证简单,高速,至少比楼上各位的快一些。C#中UINT64最大可以表示18,446,744,073,709,551,615。嗯,我们来数一数,一共是20位的数。再来个小学知识,两个数相加最大进位为数为 1 那么好了,我的思路就是“分段”UINT64最大表示20位整数,那么,我用其中的19位,也就是说你的超大数以19个一组分段。并保存成数组假设现在被加数有19*3= 57位的数吧那么数组N就有N[0]表示1-19位N[1]表示20-38位N[2]表示39-57位假设现在加数有19*3= 57位的数吧那么数组M就有M[0]表示1-19位M1]表示20-38位M[2]表示39-57位那么我们来始计算吧先算N[0] + M[0]再算N[1] + M[1]最后N[2] + M[2]由于第20位我们没有用,所以各段和不会超过UINT64的最大值。每段加完后再看一下第20位是不是1,以确认是否需要进位。这样很省内存,也很省计算量循环次数等于 位数/19 向上取整。 简单算法描述: string a = 被加数string b = 加数UINT64[] N = 向上取整(a /19)for(i = 0; i < N.lenght; i++){ N[i] = UINT64.Parse(a.substring(i * 19, 19);}//M处理同N 略 //只要加到两个数长度比较短的那个结束就行了int c = MIN(M.lenght, N.lenght)N[0] += M[0];for (i = 1 ; i < c; i++){ N[i] += M[i]; if (N[i-1]) >= 10000000000000000000) N[i] += 1 //如果有进位,再加1} //输出,我不写了,最高位,其它都只输出后19位