【ProjectEuler】ProjectEuler_020
来源:互联网 发布:汽车电脑调音软件 编辑:程序博客网 时间:2024/06/11 01:23
using System;using System.Collections.Generic;using System.Text;namespace projecteuler020{ class Program { static void Main(string[] args) { F1(); } private static void F1() { Console.WriteLine(new System.Diagnostics.StackTrace().GetFrame(0).GetMethod()); DateTime timeStart = DateTime.Now; string result = "1"; int maxValue = 100; int sum = 0; for (int i = 1; i <= maxValue; i++) { result = longMulti(result, i); } for (int i = result.Length - 1; i >= 0; i--) { sum += result[i] - '0'; } Console.WriteLine("100! = " + result); Console.WriteLine("The sum of these digits is " + sum); Console.WriteLine("Total Milliseconds is " + DateTime.Now.Subtract(timeStart).TotalMilliseconds + "\n\n"); } private static string longMulti(string s1, int n) { string result = "0"; for (int i = 0; i < n; i++) { result = longAdd(result, s1, 0); } return result; } /// <summary> /// 超大数字表达式加法 /// </summary> /// <param name="s1">数1</param> /// <param name="s2">数2</param> /// <param name="c">后面的数的进位,范围0~2</param> /// <returns></returns> private static string longAdd(string s1, string s2, int c) { //s1,s2的末位Index int l1 = s1.Length - 1; int l2 = s2.Length - 1; int x; //如果2个数都不为空 if (l1 >= 0 && l2 >= 0) { x = s1[l1] - '0' + s2[l2] - '0' + c; return longAdd(s1.Substring(0, l1), s2.Substring(0, l2), x / 10) + (x % 10).ToString(); } //下面的情况,s1和s2中至少有一个为空,我们要做的是找到那个不为空的进行下一步操作 //把不为空的值放到s1里 if (l2 >= 0) { s1 = s2; l1 = l2; } else if (l1 == -1) //表示全为空,判断最后的进位,如果没进位,返回空白,结束递归 { if (c != 0) { return c.ToString(); } return ""; } x = s1[l1] - '0' + c; //如果s1只有1位 if (l1 == 0) { return x.ToString(); } //如果s1有不止一位 return longAdd(s1.Substring(0, l1), "", x / 10) + (x % 10).ToString(); } }}/*Void F1()100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000The sum of these digits is 648Total Milliseconds is 436.5554*/