C#计算阶乘空间

因为阶乘的结果很容就超出了以有数据类型的范围,即使是Long数据类型。
所以我们要另找一个方案,比如用数组来储存算的结果,这样就可以算到Max(long)位
原理网上很多,找了一个原理大家看看:
假设数组为int[] array = new int[10000],因为1! = 1,所以首先置a[0] = 1,分别乘以2、3,得到3! = 6,此时仍只需要一个元素a[0];然后乘以4得到24,我们把个位数4放在a[0],十位数2放在a[1],这样存放结果就需要两个元素;乘以5的时 候,我们可以这样进行:用5与各元素由低到高逐一相乘,先计算个位数(a[0])4 × 5,结果为20,这样将a[0]置为0,注意要将2进到十位数,然后计算原来的十位数(a[1])2 × 5,结果为10加上刚才进的2 为12,这样十位数是2,而1则进到百位,这样就得到5! = 120;以此类推……

根据网上的原理自己封装了一个函数
List<int> GetFactorial(int a)
{
int m = 0, n = 0, nl = 0;
//超过1000计算时间会很慢,并不是不能算,建议加上多线程。
if (a < 1 || a > 1000) return new List<int>();
List<int> lst = new List<int>(a);
List<int> result = new List<int>();
for (int i = 0; i < a – 1; i++)
lst.Add(i + 2);
result.Add(1);
lst.ForEach(delegate(int c)
{
for (int d = 0; d < result.Count; d++)
{
a = c * result[d] + n;
m = a % 10;
result[d] = m;
if (a > 9)
{
n = a / 10;

}
else
{
n = 0;
}

}
if (n > 0)
{
char[] cs = n.ToString().ToCharArray();
nl = cs.GetLength(0) – 1;
for (int ii = nl; ii >= 0; ii–)
{
result.Add(Convert.ToInt32(cs[ii].ToString()));
}
n = 0;
}

});
result.Reverse();
return result;
}
希望能给大家带来帮助

C#无标题窗体移动

多年总结,有四种方法可行,

1:

Point mpoint;
int xPos,yPos;
private void label1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mpoint.X, mpoint.Y);
Location = mousePos;
xPos = mousePos.X ;
yPos = mousePos.Y ;
if(xPos<0)
xPos = 0 ;
if(yPos<0)
yPos = 0 ;
this.Location=new Point(xPos,yPos);

}//响应
}

private void label1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
mpoint = new Point(-e.X, -e.Y);
}
———————————————————————
2:
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if( e.Button == MouseButtons.Left )
{
mousePressed = true;

Point p = new Point(e.X , e.Y) ;
p = PointToScreen(p);
diff.X = p.X – DesktopLocation.X ;
diff.Y = p.Y – DesktopLocation.Y ;
}
}

private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if( mousePressed && ( e.Button & MouseButtons.Left ) != 0 )
{
Point p = new Point(e.X , e.Y) ;
p = PointToScreen(p);
p.X -= diff.X ;
p.Y -= diff.Y ;
DesktopLocation = p ;
}
}
private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
mousePressed = false;
}

3:
———————————————————————-
[DllImport(“user32.dll”)]
public static extern bool ReleaseCapture();
[DllImport(“user32.dll”)]
public static extern bool SendMessage(IntPtr hwnd,int wMsg,int wParam,int lParam);

public const int WM_SYSCOMMAND=0x0112;
public const int SC_MOVE=0xF010;
public const int HTCAPTION=0x0002;

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION, 0);
}
=================================================================================================
static int frmLastWidth=0;
static int frmLastHeight=0;
static int frmWidth;
static int frmHeight;
static bool frmIsResizing=false;
System.Drawing.Rectangle frmRectangle = new System.Drawing.Rectangle();
——————————————————————-
private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
frmRectangle.Location = new System.Drawing.Point(this.Left,this.Top);
frmRectangle.Size = new System.Drawing.Size(frmWidth,frmHeight);
ControlPaint.DrawReversibleFrame(frmRectangle, Color.Empty , System.Windows.Forms.FrameStyle.Dashed);
}

private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
frmIsResizing = false;
frmRectangle.Location = new System.Drawing.Point(this.Left,this.Top);
frmRectangle.Size = new System.Drawing.Size(frmWidth,frmHeight);
ControlPaint.DrawReversibleFrame(frmRectangle, Color.Yellow, System.Windows.Forms.FrameStyle.Dashed);
this.Width = frmWidth;
this.Height = frmHeight;
}

private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button==MouseButtons.Left)
{

//this.ResizeRedraw = false;

int sizeageX = (MousePosition.X-this.Location.X);
int sizeageY = (MousePosition.Y-this.Location.Y);

// Use this to restrict Width
if (sizeageX < 120)
sizeageX = 120;

// Use this to restrict Height
if (sizeageY < 81)
sizeageY = 81;

frmWidth = sizeageX;
frmHeight = sizeageY;
//
if (frmLastWidth == 0)
frmLastWidth = frmWidth;
if (frmLastHeight==0)
frmLastHeight = frmHeight;
if (frmIsResizing)
{
frmRectangle.Location = new System.Drawing.Point(this.Left,this.Top);
frmRectangle.Size = new System.Drawing.Size(frmLastWidth,frmLastHeight);
}

frmIsResizing = true;

ControlPaint.DrawReversibleFrame(frmRectangle, Color.Yellow , System.Windows.Forms.FrameStyle.Dashed);

frmLastWidth = frmWidth;
frmLastHeight = frmHeight;

frmRectangle.Location = new System.Drawing.Point(this.Left,this.Top);
frmRectangle.Size = new System.Drawing.Size(frmWidth,frmHeight);

ControlPaint.DrawReversibleFrame(frmRectangle, Color.Yellow , System.Windows.Forms.FrameStyle.Dashed );
}
}

C#枚举运算使用技巧

位运算符:& (按位与)、| (按位或)、^ (按位异或)、~ (按位取反)、>> (按位右移)、<< (按位左移)。

& ( 按位与): 概念上来讲就是二进制上按每一位(0或1)进行与运算。 那么与运算是什么意思该不用我说吧,就是两者都是1结果为真。其中一个为0结果为假。这里不可能有0、1之外的数,这里是二进制。先看一个8位二进制的例子:

7 & 8 = 0000 0 111 & 0000 1000 = 0000 0000 = 0

7 & 3 = 0000 0111 & 0000 0011 = 0000 0011 = 3

很简单吧。不用多说了,就是操作0和1。

^( 按位异或): 概念上来讲就是二进制上按每一位(0或1)进行异或运算。 异或运算简单讲就是相同就为假,不同为真。

7 ^ 3 = 0000 0111 ^ 0000 0011 = 0000 0100 = 4

>>( 按位右移): 概念上来讲就是二进制上按每一位(0或1)进行右移运算。 右移运算简单讲就是将二进制的位整体向右移动。

7 >> 2 = 0000 0111 >> 2 = 0000 0001 = 1 // 这里向右移动了2位,最低位的两个1被抹去。

这里右移两位等于除了2的2次方,7/4 = 1 在整数除法中则看成是被舍掉了小数部分。

<<( 按位左移): 这个就不说了,与上面右移方向的相反。

左移两位等于乘以2的2次方 7<<2 = 28;
对一个枚举进行加,减,是否存在操作:
比如我有一个枚举是这样:
public enum ReadEnum
{
Add = 1,
Update = 2,
Delete = 4,
Select = 8,
All = Add | Update | Delete | Select
}
枚举删除操作:
ReadEnum RemoveOne(ReadEnum itemNeedRemove, ReadEnum removeItem)
{
return itemNeedRemove & (ReadEnum.All ^ removeItem);
}
是否存在一个枚举操作:
bool IsHaveOne(ReadEnum itemNeedAdd, ReadEnum item)
{
return (itemNeedAdd & item) == item;
}
增加一个枚举操作:
ReadEnum AddOne(ReadEnum itemNeedAdd, ReadEnum addItem)
{
return itemNeedAdd | addItem;
}

当时学C语言时都很精通,现在都要忘了,在这里记下。

~( 按位取反): 概念上来讲就是二进制上按每一位(0或1)进行取反运算。 取反运算简单讲就是0变1,1变0。

~7 = ~0000 0111 = 1111 1 000 = 0xf8 = 248 (无符号)

7 | 8 = 0000 0 111 | 0000 1000 = 0000 1111 = 15

7 | 3 = 0000 0111 | 0000 0011 = 0000 0111 = 7

| ( 按位或): 概念上来讲就是二进制上按每一位(0或1)进行或运算。 那么或运算是什么意思该不用我说吧,就是两者都是0结果为假。其它情况都为真。

在Mysql中的位运算:

不使用1-12的数字来表示月份,而是使用1,2,4,8,16,32,64,128,512,1024,2048,4096来表示。

以下为使用技巧:

1. 当我们需要查询某个月份的景点时,例如查询3月份的景点,可使用以下语句:

SELECT * FROM `spots` WHERE `month` & 4 = 4

2. 当设置某个景点适合某个月份时,例如设置4325的景点适合2月份,可使用下面的语句:

UPDATE `spots` SET `month` = `month` | 2 WHERE `id` = 4325

3. 当取消设置某个景点的月份时,可使用下面的语句:

UPDATE `spots` SET `month` = `month` ^ 2 WHERE `id` = 4325

4. 查询同时适合多个月份的数据,例如需要查询设置了11,12,1月份的景点,将其三个月份对应的数值加起来,结果为6146,然后使用这个数值进行查询:

SELECT * FROM `spots` WHERE `month` & 6146 = 6146