chaos_blue(chaos) caihanchao(超超) seekg() 用你们的windows的自带的计算器看看100!是多少 9.3326215443944152681699238856267e+157你认为int,long可以存储这么大的数字吗??尤其是chaos_blue(chaos),看看自己的程序,想想自己的话,你才不适合 不懂就问的基本道理都不知道 //---------------------------------------------------- 有点太菜鸟了,鄙人菜鸟都会这些问题,所以我认为如果你自己不能够根据所学和数据结构写出来的话,我认为你不适合当程序员。 C float Result = 1; for(int i = 0;i<100 ; i ++) { Result = Result * (i + 1); }请恕我狂言了。愿你成功。 //--------------------------------------------------------
public string Factorial(int k) { int i = 1; string r = "1"; while(i <= k) { r = bbb(i.ToString(),r); i++; } return r; } public string Add(string a, string b) { if (a.Length > b.Length) { int l = 0; int k = a.Length - b.Length; while(l < k) { b = b.Insert(0,"0"); l++; } } if (a.Length < b.Length) { int l = 0; int k = b.Length - a.Length; while(l < k) { a = a.Insert(0,"0"); l++; } } string s = ""; int t = 0; for(int i = a.Length - 1; i >= 0; i--) { int c = int.Parse(a[i].ToString()) + int.Parse(b[i].ToString()) + t; if (c.ToString().Length > 1) { s = s.Insert(0,c.ToString()[1].ToString()); t = int.Parse(c.ToString()[0].ToString()); } else { s = s.Insert(0,c.ToString()[0].ToString()); t = 0; } } if(t != 0) s = s.Insert(0,t.ToString()); return s; } public string Mutiply(string s1,string s2) { string r = "0"; for(int i = 0; i < int.Parse(s1); i++) r = aaa(r,s2); return r; } }
第一题很明显是要高精度算法 普通阶乘难道不显得太简单了吗? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim result() As Short result = GetPoly(1) For i As Integer = 1 To 100 result = PolyMult(result, GetPoly(i)) Next Dim sb As New System.Text.StringBuilder() For i As Integer = result.Length - 1 To 0 Step -1 sb.Append(result(i).ToString) Next MsgBox(sb.ToString.TrimStart("0"c)) End Sub Public Function GetPoly(ByVal x As Integer) As Short() Dim result() As Short = New Short(x.ToString.Length - 1) {} Dim i As Integer = 0 Do While x > 0 result(i) = x Mod 10 x \= 10 i += 1 Loop Return result End Function Function PolyMult(ByVal a() As Short, ByVal b() As Short) As Short() Dim result(a.Length + b.Length - 1) As Short For i As Integer = 0 To a.Length - 1 For j As Integer = 0 To b.Length - 1 If a(i) <> 0 Or b(j) <> 0 Then result(i + j) += a(i) * b(j) End If Next Next For x As Integer = 0 To result.Length - 1 Do While result(x) >= 10 result(x + 1) += 1 result(x) -= 10 Loop Next Return result End Function
to lbsong(萝卜头)第三道题用你的解法就太慢了,这道题完全有O(N)的解法 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim N As Integer = 500 For i As Integer = 1 To N / 2 Dim x As Single = GetX(N, i) If x > 0 AndAlso x = Int(x) Then MsgBox("Start with " & x & ", Number: " & i) End If Next End Sub Private Function GetX(ByVal N As Integer, ByVal i As Integer) As Single Return (N - (i * i + i) / 2) / (i + 1) End Function写起来又短速多又快很多
第三题思路: 从X开始,连续i + 1个数的和等于N(=500),那么 X + (X+1) + (X+2) + ... + (X+i) = N 则 (i+1)X + (i*i + i)/2 = N X = (N - (i*i + i)/2)/(i+1)i从1到N/2搜索,当发现满足上式的X正整数解,就发现了原问题的一个解
2、转成字符串,然后截取再判断
3、前两天坛子里有,搜一下
4、5、仁者见仁,智者见智。
C
float Result = 1;
for(int i = 0;i<100 ; i ++)
{
Result = Result * (i + 1);
}请恕我狂言了。愿你成功。
2、写个汉字的数组,然后一一对应转换
3、坛子里有
4/5 具体问题具体分析
public viod jiecheng(int n)
{
string s;
int jieguo=1;
bool chenghao=false;
for (;n>0;n--)
{
jieguo*=n;
if(chenghao==true)s+="*";
s+=n;
chenghao=true;
jieguo=jieguo*n
}
s+=jieguo.tostring();
WriteLine(s);
}
int cc(int n)
{
int result = 1;
int count = n;
while(1<=count)
{
result = result * count;
count--;
}
return result;
}
{
int start,result=0;
for(int n=1; n<500; n++)
{
start=n;
for(int i=n; i<500;i++)
{
int resulut+=i;
if(reslut=500)write(start,i)
if(reslut>500)break;
}
}
}
public void write(int start, int i)
{
string s="(";
bool tr=false;
for(;start<i;start++)
{
if(tr)s+=",";
s+=start.tostring()
}
s+=")"
WriteLine(s);
}
正在找工作
应该这样实现用500整除奇数(x),得到商为偶数(y),
取(y-(x-1)/2)+ ...+(y-2)+(y-1)+y(y+1)+(y+2)+...+(y+(x-1)/2)这个值就是500
还有个条件 500/x > (x-1)/2,否则,就会取道负数。
程序自己实现吧
用你们的windows的自带的计算器看看100!是多少
9.3326215443944152681699238856267e+157你认为int,long可以存储这么大的数字吗??尤其是chaos_blue(chaos),看看自己的程序,想想自己的话,你才不适合
不懂就问的基本道理都不知道
//----------------------------------------------------
有点太菜鸟了,鄙人菜鸟都会这些问题,所以我认为如果你自己不能够根据所学和数据结构写出来的话,我认为你不适合当程序员。
C
float Result = 1;
for(int i = 0;i<100 ; i ++)
{
Result = Result * (i + 1);
}请恕我狂言了。愿你成功。
//--------------------------------------------------------
main(){
int i,j,k,m;
for(i=0;i<=500;i++)
{
j=i;
m=i;
k=0;
for(j=i;j<=500;j++)
{
k=k+j;
if(k==500)
{
printf("num%d\n",k); for(;m<=j;m++)
{
printf("%d ",m);
}
printf("\n\n\n");
}
}
}
getch();
}
{
int i = 1;
string r = "1";
while(i <= k)
{
r = bbb(i.ToString(),r);
i++;
}
return r;
} public string Add(string a, string b)
{
if (a.Length > b.Length)
{
int l = 0;
int k = a.Length - b.Length;
while(l < k)
{
b = b.Insert(0,"0");
l++;
}
} if (a.Length < b.Length)
{
int l = 0;
int k = b.Length - a.Length;
while(l < k)
{
a = a.Insert(0,"0");
l++;
}
} string s = "";
int t = 0;
for(int i = a.Length - 1; i >= 0; i--)
{
int c = int.Parse(a[i].ToString()) + int.Parse(b[i].ToString()) + t;
if (c.ToString().Length > 1)
{
s = s.Insert(0,c.ToString()[1].ToString());
t = int.Parse(c.ToString()[0].ToString());
}
else
{
s = s.Insert(0,c.ToString()[0].ToString());
t = 0;
}
}
if(t != 0)
s = s.Insert(0,t.ToString());
return s;
} public string Mutiply(string s1,string s2)
{
string r = "0";
for(int i = 0; i < int.Parse(s1); i++)
r = aaa(r,s2);
return r;
}
}
三个函数,Add是对两个大数的加法运算,全部转换成字符串来实现,Mutiply是乘法,调用的Add来实现,Factorial是阶乘,调用Mutiply来实现
608941463976156518286253697920827223758251185210916864000000000000000000000000
呵呵~~~
阶乘得用double
:P
普通阶乘难道不显得太简单了吗? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim result() As Short
result = GetPoly(1)
For i As Integer = 1 To 100
result = PolyMult(result, GetPoly(i))
Next Dim sb As New System.Text.StringBuilder()
For i As Integer = result.Length - 1 To 0 Step -1
sb.Append(result(i).ToString)
Next
MsgBox(sb.ToString.TrimStart("0"c))
End Sub Public Function GetPoly(ByVal x As Integer) As Short()
Dim result() As Short = New Short(x.ToString.Length - 1) {}
Dim i As Integer = 0
Do While x > 0
result(i) = x Mod 10
x \= 10
i += 1
Loop
Return result
End Function Function PolyMult(ByVal a() As Short, ByVal b() As Short) As Short()
Dim result(a.Length + b.Length - 1) As Short
For i As Integer = 0 To a.Length - 1
For j As Integer = 0 To b.Length - 1
If a(i) <> 0 Or b(j) <> 0 Then
result(i + j) += a(i) * b(j)
End If Next
Next
For x As Integer = 0 To result.Length - 1
Do While result(x) >= 10
result(x + 1) += 1
result(x) -= 10
Loop
Next
Return result
End Function
乘法可以高精度实现,无须加法To qiekong(blue)
不用递归
考虑更通用的算法,如果阶乘的数比较大的时候,乘法也不能用高精度数实现了
比如:10000000000000*10000000000000的时候
32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,
66,65,64,63,62,61,60,59,
102,101,100,99,98, Stack stk = new Stack(); int j = 0;
while(j < 250)
{
int r = 0;
for(int i = j; i < 250; i++)
{
r = r + i; if(r < 500)
stk.Push(i);
else if(r == 500)
{
stk.Push(i);
int k = 0;
int count = stk.Count;
while(k < count)
{
int t = (int)(stk.Pop());
Console.Write(t.ToString() + ",");
k++;
}
j++;
Console.WriteLine();
break;
} else if(r > 500)
{
stk.Clear();
j++;
break;
}
}
} Console.Read();
}
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
int input=100;
double temp=1;
for(int i=1;i<=input;i++)
{
temp=temp*i;
//i+=1;
Console.WriteLine("temp="+temp.ToString());
Console.WriteLine("I="+i.ToString());
}
Console.WriteLine(temp.ToString());
}
}
}
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim N As Integer = 500 For i As Integer = 1 To N / 2
Dim x As Single = GetX(N, i)
If x > 0 AndAlso x = Int(x) Then
MsgBox("Start with " & x & ", Number: " & i)
End If
Next
End Sub Private Function GetX(ByVal N As Integer, ByVal i As Integer) As Single
Return (N - (i * i + i) / 2) / (i + 1)
End Function写起来又短速多又快很多
从X开始,连续i + 1个数的和等于N(=500),那么
X + (X+1) + (X+2) + ... + (X+i) = N
则
(i+1)X + (i*i + i)/2 = N
X = (N - (i*i + i)/2)/(i+1)i从1到N/2搜索,当发现满足上式的X正整数解,就发现了原问题的一个解
-------------------------------------
100的阶乘等于93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000用4个double也算不出来,不用高精度算法没戏。
-------------------------------------100的阶乘好像最多也就是10的150多次方吧?double可以存储10的300多次方,为什么double会溢出,请指教~~~~~
不知道对不对???????