求下面C#题目的解法及其源码
在 C# 语言中整数类型 int 它的值域为 -2147483648 至 2147483647
,有效数字只有十位数,若两个很大的整数相乘一定会超过十位数而产生
溢出 (overflow) 答案就不正确了,请设计一个方法解决这个问题。
static int[] product (int a, int b)
以下列数据测试。
csc Ex0814.cs <Enter>
Ex0814 123456789 987654321 <Enter>
121932631112635269
问题点数:20、回复次数:17Top
1 楼cf1944(cf1943)回复于 2005-08-04 15:04:31 得分 1
帮顶,只可惜自己还是个初学者Top
2 楼pupo(泡泡)回复于 2005-08-04 15:08:29 得分 1
去搜索一下大数相乘,一般这种都用字符串来进行计算Top
3 楼alang_jj(阿郎)回复于 2005-08-04 15:15:46 得分 1
int a;
int b;
long c;
a = 123456789;
b = 987654321;
c = (long)(a*b);Top
4 楼wuyi8808(空间/IV)回复于 2005-08-04 15:24:51 得分 2
class Test
{
static void Main(string [] args)
{
System.Console.WriteLine(decimal.Parse(args[0])*decimal.Parse(args[1]));
}
}
Top
5 楼an_andy()回复于 2005-08-04 16:05:29 得分 0
顶一下Top
6 楼soft5257()回复于 2005-08-04 16:47:22 得分 0
我要的是这些代码:
using System;
public class Ex0814
{
static int[] product(int a,int b)
{
//写出product方法代码
}
public static void Main(string[] args)
{
//写出主函数代码
}
}Top
7 楼soft5257()回复于 2005-08-04 17:48:43 得分 0
没有人会吗??Top
8 楼lovefootball(蟑螂(生活就是扯淡--做人要放低姿态))回复于 2005-08-04 17:57:01 得分 2
就是一个普通的高精度算法
前几天有个人发了计算100阶乘的方法
你找找
Top
9 楼lovefootball(蟑螂(生活就是扯淡--做人要放低姿态))回复于 2005-08-04 18:07:51 得分 0
http://dev.csdn.net/develop/article/28/28828.shtm
http://ms.mblogger.cn/zxq527/posts/16166.aspxTop
10 楼tiaoci(我挑刺,我快乐)回复于 2005-08-04 18:34:43 得分 0
转成longTop
11 楼Macosx(结贴)回复于 2005-08-05 11:23:07 得分 0
大整数相乘是最基本的算法 自己写写吧Top
12 楼hstc_fat(脚毛一两跟)回复于 2005-08-05 11:35:41 得分 0
乘法运算重载Top
13 楼weisunding(鼎鼎)回复于 2005-08-05 12:11:04 得分 0
方法简单,采用定点数做法,对原数进行缩放(这里是缩小)Top
14 楼soft5257()回复于 2005-08-05 16:25:12 得分 0
可是我做不出!!!你们给写一写!!!Top
15 楼Roaming_Sheep(Roaming Sheep)回复于 2005-08-05 16:34:02 得分 0
可是我做不出!!!你们给写一写!!!
————————————————————
做不出乘早转行!Top
16 楼cdo(Everything has a favourable turn)回复于 2005-08-05 16:36:49 得分 0
用double可以算Top
17 楼malingxian(Mask)回复于 2005-08-05 16:44:22 得分 13
//在网上找到的,希望对你有用。
using System;
class bignumber
{
public static string stringadd(string s1,string s2)
{
string s="";
if(s1.Length==0)
return s2;
else if(s2.Length==0)
return s1;
if(s1[0]=='-'&s2[0]=='-')
{
s1=s1.Remove(0,1);
s2=s2.Remove(0,1);
s='-'+stringadd(s1,s2);
}
else if(s1[0]=='-')
{
s1=s1.Remove(0,1);
//Console.WriteLine(s1);
s=stringsub(s2,s1);
}
else if(s2[0]=='-')
{
s2=s2.Remove(0,1);
s=stringsub(s1,s2);
}
else
{
int a,b;
a=s1.Length;
b=s2.Length;
if(a<b)
s=stringadd(s2,s1);
else
{
int flag=0,i,c;
s1=reverse(s1);
s2=reverse(s2);
for(i=0;i<=b-1;i++)
{
c=s1[i]+s2[i]-96+flag;
flag=c/10;
s=c%10+s;
}
for(i=b;i<a;i++)
{
c=s1[i]-48+flag;
flag=c/10;
s=c%10+s;
}
if(flag==1)
s=flag+s;
}
}
return s;
}
public static string stringsub(string s1,string s2)
{
string s="";
int a;
a=comparestr(s1,s2);
if(a==-1)
s='-'+stringsub(s2,s1);
else if(a==0)
s=s+0;
else
{
int flag=0,i,c;
s1=reverse(s1);
s2=reverse(s2);
flag=0;
for(i=0;i<s2.Length;i++)
{
c=s1[i]-s2[i]-flag;
if(c<0)
{
c=c+10;
flag=1;
}
else
flag=0;
s=c+s;
}
for(i=s2.Length;i<s1.Length;i++)
{
c=s1[i]-48-flag;
if(c<0)
{
c=c+10;
flag=1;
}
else
flag=0;
s=c+s;
}
i=0;
while(i<s.Length&s[i]=='0')
i++;
if(i==s.Length)
s=s.Remove(0,i-1);
else
s=s.Remove(0,i);
}
return s;
}
public static string reverse(string s)
{
int i;
string s1="";
for(i=s.Length-1;i>=0;i--)
s1=s1+s[i];
return s1;
}
public static int comparestr(string s1,string s2)
{
int a,b,i;
a=s1.Length;
b=s2.Length;
if(a>b)
return 1;
else if(a<b)
return -1;
else
{
i=0;
while(i<a&&s1[i]==s2[i])
i=i+1;
if(i==a)
return 0;
else
if(s1[i]>s2[i])
return 1;
else
return -1;
}
}
public static string bigmaltiplay(string s1,string s2)
{
string s="";
if(s1[0]=='-'&s2[0]=='-')
{
s1=s1.Remove(0,1);
s2=s2.Remove(0,1);
return bigmaltiplay(s1,s2);
}
else if(s1[0]=='-')
{
s1=s1.Remove(0,1);
s='-'+bigmaltiplay(s1,s2);
return s;
}
else if(s2[0]=='-')
{
s2=s2.Remove(0,1);
s='-'+bigmaltiplay(s1,s2);
return s;
}
int a,b,i;
string S1A,S1B,S2C,S2D,s3,s4,s5,s6,s7,s8;
a=s1.Length;
b=s2.Length;
if(a==0|b==0)
return "";
i=0; //---开始把S1和S2前面的零去掉
while(i<a&&s1[i]=='0')
i=i+1;
if(i==a)
s1=s1.Remove(0,i-1);
else
s1=s1.Remove(0,i);
i=0;
while(i<a&&s2[i]=='0')
i=i+1;
if(i==a)
s2=s2.Remove(0,i-1);
else
s2=s2.Remove(0,i);//-----结束--------
if(a<=3&b<=3)
s=s+int.Parse(s1)*int.Parse(s2);
else if(b>a)
s=bigmaltiplay(s2,s1);
else
{
if(b<=a/2)
{
S1B=s1.Substring(a-b,b);
S1A=s1.Remove(a-b,b);
S2C="0";
S2D=s2;
s3=bigmaltiplay(S1A,S2C);
s4=bigmaltiplay(S1B,S2D);
s5=bigmaltiplay(stringsub(S1A,S1B),stringsub(S2D,S2C));
s6=stringadd(s3,s4);
s7=stringadd(s5,s6);
s8=stringadd(s3.PadRight(2*b+s3.Length,'0')
,s7.PadRight(b+s7.Length,'0'));
s=stringadd(s8,s4);
}
else
{
S1A=s1.Substring(0,a/2);
S1B=s1.Remove(0,a/2);
S2C=s2.Substring(0,b-a/2-a%2);
S2D=s2.Remove(0,b-a/2-a%2);
s3=bigmaltiplay(S1A,S2C);
s4=bigmaltiplay(S1B,S2D);
s5=bigmaltiplay(stringsub(S1A,S1B),stringsub(S2D,S2C));
s6=stringadd(s3,s4);
s7=stringadd(s5,s6);
s8=stringadd(s3.PadRight((a/2+a%2)*2+s3.Length,'0')
,s7.PadRight(a/2+a%2+s7.Length,'0'));
s=stringadd(s8,s4);
}
}
return s;
}
public static void Main()
{
string s1,s2;
for(int i=1;i<3;i++)
{
Console.WriteLine("请输入两个数:");
s1=Console.ReadLine();
s2=Console.ReadLine();
Console.WriteLine(bigmaltiplay(s1,s2));
}
}
}Top




