Project Euler Question 4

这道题目在运用C# 解决的过程中,需要注意到:

1. C# 中的变量有 值类型,存在stack中,也有 引用类型,存在heap中,但是地址存在stack中。在 C# 中,当我们用 等于号,=,进行赋值操作时,要注意,当等于号两端都是 引用类型时,默认的赋值方式是弱拷贝类型的。当我们对一个变量进行操作时(本质上是对 heap 上的数据进行改变),另外的变量也会改变。


2. C# 语言中的数据类型之间的转换较之 Python 更为繁琐,例如,mychar 是一个一维的字符串数组(char[]  mychar ={'P','i','g'}),myChar.ToString() 的值不是一个string,而是 System.Char[]【具体为什么我还不清楚,但正确的做法是 string mystring = new string (mychar);】; Array.reverse(mychar) 的返回值是空值,而不是reversed_mychar【简直反人类?!!】


3. C# 中,对于数组与列表的定义简直一塌糊度。

  • 数组(Array): 必须定义长度
    string str = new string [2]; // Array

  • 数组列表(ArrayList):不必定义长度,数据类型不必一致
    ArrayList ls= new ArrayList();  // ArrayList

  • 列表(List):不必定义长度,数据类型必须一致
    List<string> myArrayList = new List<string> ();

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;




namespace ProjectEuler01
{
    class Program
    {


        static void Main(string[] args)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            C# 的变量类型转换十分繁琐,两个引用型变量不能检查是否相等 【char.ToString()】这种就不能比较
            //char[] a = { 'x', 'x' };
            //char[] b = { 'y' };
            //Console.WriteLine(a);
            //Console.WriteLine(b);
            //Char c = 'A';
            //Char d = 'A';
            //var g = a.ToString();
            //Console.WriteLine(g);
            //string e = new string(a);
            //string f = new string(b);
            //Console.WriteLine(e);
            //Console.WriteLine(f);

            //Console.WriteLine("{0}等于{1},所以{2}",e,f,e.Equals(f));

            // Write your code here!

            List<int> mylist = new List<int> { };

            for (int i = 999; i > 100; i--)
            {
                for (int j = 999; j > 100; j--)
                {
                    // 注意却分 C# 中的值类型变量 和 引用类型变量 的 深浅拷贝之分
                    // 注释部分是浅拷贝,只拷贝了堆中的地址。
                    // 当我们想分别改变两个引用型变量的数值时,我们应该避免在两个变量 数据类型 相同时赋值。
                    //char[] max = (i * j).ToString().ToCharArray();
                    //Console.WriteLine(max);
                    //char[] rev = max; 
                    //Console.WriteLine(max);
                    //Array.Reverse(max);
                    //Console.WriteLine(rev);
                    //Console.WriteLine(max);

                    int maxi = i * j;
                    char[] rev_char = maxi.ToString().ToCharArray();
                    Array.Reverse(rev_char);
                    char[] max_char = maxi.ToString().ToCharArray();
                    //Console.WriteLine("=====================================");
                    //Console.WriteLine(max_char);
                    //Console.WriteLine("=====================================");
                    //Console.WriteLine(rev_char);
                    if ( new string(max_char) == new string(rev_char) )
                    {
                        mylist.Add(i * j);
                        //Console.WriteLine("{0} 和 {1} 的乘积 {2}是回文",i,j,i*j);
                        //Console.ReadLine();
                        
                    }
                  
                }
            }
            Console.WriteLine(mylist.Max());
           
            


            watch.Stop();
            double ts = watch.Elapsed.TotalMilliseconds;
            Console.WriteLine("Totoal running time is " + ts + " ms ");
            Console.ReadLine();
        }

    }

   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值