CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

求下面C#题目的解法及其源码

楼主soft5257()2005-08-04 14:50:48 在 .NET技术 / 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

相关问题

  • 急,需要非迭代法的线性方程组的解法(c/c++源码)
  • 求C#源码!!!
  • C的题目
  • 求Beginning C# 源码
  • C题目,求解!
  • 一个C题目
  • 收购C++题目.
  • 求C++模板源码
  • 求C#工资源码
  • 急需DES c/C++源码一份

关键词

  • c#
  • 代码
  • bigmaltiplay
  • 相乘
  • 整数
  • remove
  • 方法
  • length
  • args
  • ex0814

得分解答快速导航

  • 帖主:soft5257
  • cf1944
  • pupo
  • alang_jj
  • wuyi8808
  • lovefootball
  • malingxian

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo