* 无限位数相乘的设计:
* 规则:从乘数的个位起分别与被乘数的个位起的各位相乘,积大于10的十位的数作为进位,个位作为位积,进位与下位积相加,乘数十位的积乘10(即最后面补1个0)后与个位的积相加,百位的积乘100(即最后面补2个0)后与上次的积相加,依次类推;
* 针对“0”的处理:修改相关语句及部分代码优化;
* 乘法的本质是一个数的累加法的概括,因此,可以用加法去实现乘法,如2+2+2=6,有3个2进行累加,因此,乘法表达式为2*3=6;
* 累加乘法的设计:
static string 无限位数相乘(string 被乘数, string 乘数, bool 科学记标 = false)
{
if (乘数 == "0") return "0";/*针对“0”的处理*/
if (乘数 == "1") return 被乘数;/*针对乘数“1”的优化,不入运算*/
string 位积 = "", 积 = "", 权 = "", 乘位值 = "";
int 位1 = 0, 序 = 乘数.Length - 1, 进位值 = 0, 个数 = 0;
if (科学记标)
{
int 划分 = 被乘数.IndexOf("×");
if (划分 > 0)
{
个数 = int.Parse(被乘数.Substring(划分 + 4));
被乘数 = 被乘数.Substring(0, 划分);
}
}
Action 位数相乘 = delegate()
{
位1 = 被乘数.Length - 1; 位积 = ""; 进位值 = 0;
do
{
int 相乘值 = int.Parse(被乘数[位1].ToString()) * int.Parse(乘位值) + 进位值;/*写法适用于任意位的运算*/
进位值 = 相乘值 > 9 ? 相乘值 / 10 : 0;/*获取进位*/
位积 = (相乘值 % 10).ToString() + 位积;/*合成*/
} while (--位1 >= 0);
if (进位值 > 0)
位积 = 进位值.ToString() + 位积;/*最后合成*/
};
乘位值 = 乘数[序--].ToString();/*针对“0”的处理*/
if (乘位值 != "0")/*首次个位积*/
{
位数相乘();
积 = 位积;
}
while (序 >= 0)
{
权 += "0";/*十位起提升位数*/
乘位值 = 乘数[序--].ToString();/*针对“0”的处理*/
if (乘位值 != "0")
{
位数相乘();
积 = 无限位数相加(积, 位积 + 权)[0];
}
}
if (科学记标)
{
int 记法 = 积.Length;
while (积[--记法] == '0') ++个数;
if (个数 >= 4)
积 = 积.Substring(0, 记法 + 1) + "×10^" + 个数.ToString();
}
return 积;
}
调用:
/*累加乘法的设计*/
string 被乘数 = "12345", 乘数 = "123", 积 = "";
int 序 = 2;/*第一次计算为2个数相加,因此,设为2开始*/
do
{
积 = 无限位数相加((积 == "" ? 被乘数 : 积), 被乘数);
} while (++序 <= int.Parse(乘数));
Console.WriteLine("正确运算:{0}", 积);
/*如果,乘数超过int范围,循环条件的比较表达式应改为其它比较方式,返回布尔值*/
验证:
int aa = 1;
while (aa * aa > 0)
{
string aaaa = 无限位数相乘(aa.ToString(), aa.ToString());
if (aaaa == (aa * aa++).ToString())
Console.WriteLine("相乘运算:{0}", aaaa.ToString());
else
Console.WriteLine("运算:{0}", aa.ToString());
}
int aa = 1; string 阶乘 = "1";
do
{
阶乘 = 无限位数相乘(阶乘, aa.ToString());
Console.Write("正确运算:{0}阶", aa.ToString());
Console.WriteLine("={0}", 阶乘);
} while (++aa <= 100);
改为可接续int最大位数字符串范围运算:
string aa = "1"; string 阶乘 = "1";
List<string> 读积与乘数 = 读文本记录(@System.Environment.CurrentDirectory + "\\求阶乘\\积与乘数.txt");
if (读积与乘数.Count > 0) { 阶乘 = 读积与乘数[0]; aa = 读积与乘数[1]; }
do
{
阶乘 = 无限位数相乘(阶乘, aa);
Console.Write("运算:{0}阶", aa);
Console.WriteLine("={0}", 阶乘);
写改记录(aa + "阶" + "=" + 阶乘 + "\r\n", "求阶乘", "阶乘集", aa);
aa = 无限位数相加(aa, "1");
写改记录(阶乘 + "\r\n" + aa, "求阶乘", "积与乘数", aa, false);
} while (阶乘.Length < int.MaxValue);