笔试题汇集之大数处理篇(C/C++)

原创 2012年03月25日 22:17:08

输入二个64位的十进制数,计算相乘之后的乘积。

答:以下代码为网上别人贴出的,输入任意位数十进制数(包括小数,负数)都可以得出正确结果。

思路是:将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写乘法。

#include <iostream.h>

#define MAX 100

int str_num(char str[]) //计算字符串的长度,等效于strlen(str);

{

  int i=0,num_str=0;

  while(str[ i ]!=0)

  {num_str++;

  i++;

  }

  return(num_str);

}

void place(int num_str,char str[]) //将字符串高低颠倒。

{

  int temp=0,i=0,j=0;

  for(i=0,j=num_str-1;i<j;i++,j--)

  {temp=str[j];

  str[j]=str[ i ];

  str[ i ]=temp;

  }

}

void transition(unsigned int a[],char str1[]) //数字字符转化为数字。

{

  int i=0;

  while(str1[ i ]!=0)

  {a[ i ]=str1[ i ]-'0';

  i++;

  }

}

void multiply_int(unsigned int a[],unsigned int b[],unsigned int c[]) //大数相乘算法,入口为整形数组。

{

  int i=0,j=0;

  for(i=0;i<MAX;i++)

  for(j=0;j<MAX;j++)

  {

    c[ i+j ]+=a[ i ]*b[ j ];

    c[ i+j+1 ]+=c[ i+j ]/10;

    c[ i+j ]%=10;

  }

}

void output(int sign,unsigned int c[],int quan) //数据输出。

{

  int sign_temp=0,i=0;

  cout<<"The result is: ";

  if(sign==1)

  cout<<"-";

  for(i=MAX-1;i>-1;i--)

  {

    if(sign_temp==0)

    {if(c[ i ]!=0)

    sign_temp=1;

    }

    if(sign_temp==1)

    {

      if(i==quan-1)

      cout<<".";

      cout<<c[ i ];

      c[ i ]=0;

    }

  }

  cout<<endl;

}

void multiply_string(char str1[],char str2[],unsigned int c[]) //大数相乘,入口为字符串。

{

  unsigned int a[MAX]={0},b[MAX]={0};

  int sign=0;

  transition(a,str1);

  transition(b,str2);

  multiply_int(a,b,c);

}

int sign_comp(char str1[],char str2[]) //符号判断,如果为负数将作相应处理。

{

  int i=0,sign_num=0;

  if(str1[0]==45)

  {sign_num=!sign_num;

  for(i=0;i<MAX-1;i++)

  str1[ i ]=str1[ i+1 ];

  }

  if(str2[0]==45)

  {sign_num=!sign_num;

  for(i=0;i<MAX-1;i++)

  str2[ i ]=str2[ i+1 ];

  }

  return (sign_num);

}

int format(char str[]) //将输入的字符串进行格式化。以得到字符的一些标志信息和相应格式的新数据串。

{

  int point=0,quan=0,i=0,j,k=0,sign_point=0,num_str=0;

  num_str=str_num(str);

  while(str[ i ]!=0)

  {

    if(str[ i ]<'0'||str[ i ]>'9')

    if(str[ i ]!='.')

    {cout<<"data error"<<endl;

    return(-1);

    }

    else

    {point++;

    sign_point=i;

    }

    if(point>1)

    {cout<<"data error"<<endl;

    return(-1);

    }

    i++;

  }

  if(point==1)

  {

    for(j=sign_point;j<num_str;j++)

    str[j]=str[j+1];

    num_str--;

    quan=num_str-sign_point;

  }

  place(num_str,str);

  return(quan);

}

void clear(char str[]) //清空函数。

{

  int i;

  for(i=0;i<MAX;i++)

  {

    str[ i ]=0;

  }

}

 

void main(void) //主函数。

{

  char str1[MAX]={0},str2[MAX]={0};

  int quan1=0,quan2=0,sign=0;

  unsigned int c[MAX*2+1]={0};

  do

  {

    cout<<"Please input the first number:";

    cin>>str1;

    cout<<"Please input the second number:";

    cin>>str2;

    sign=sign_comp(str1,str2);

    quan1=format(str1);

    quan2=format(str2);

    if(quan1==-1||quan2==-1)

    { 

      clear(str1);

      clear(str2);

    }

  }while(quan1==-1||quan2==-1||str1[0]==0||str2[0]==0);

  multiply_string(str1,str2,c);

  output(sign,c,quan1+quan2);

}

 

-------------------------------------------------------------------------------------------------------------------------------------

下面的是大整数的运算.

#include<iostream>

using namespace std;

#define MAX 10000

struct Node{

   int data;

   Node *next;

};

void output(Node *head)

{

   if(!head->next&&!head->data)return;

   output(head->next);

   cout<<head->data;

}

void Mul(char *a,char *b,intpos)        

{

   char *ap=a,*bp=b;

   Node *head=0;

   head=newNode;head->data=0,head->next=0;   //

   Node *p,*q=head,*p1;

   int temp=0,temp1,bbit;

  while(*bp)               //若乘数不为空 ,继续.

   {

       p=q->next;p1=q;

      bbit=*bp-48;          //把当前位转为整型

      while(*ap||temp)           //若被乘数不空,继续

       {

          if(!p)            //若要操作的结点为空,申请之

           {

               p=new Node;

               p->data=0;

               p->next=0;

               p1->next=p;

           }

           if(*ap==0)temp1=temp;

           else {temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }

          p1->data=temp1%10;    //留当前位

          temp=temp1/10;    //进位以int的形式留下.

          p1=p;p=p->next;                //被乘数到下一位

       }

      ap=a;bp++;q=q->next;               //q进下一位

   }

   p=head;

  output(p);                  //显示

   cout<<endl;

  while(head)                //释放空间

   {

           p=head->next;

           delete head;

           head=p;

   }

}

int main()

{

   cout<<"请输入两个数"<<endl;

   char test1[MAX],test2[MAX];

   cin.getline(test1,MAX,'\n');

   cin.getline(test2,MAX,'\n');

   Mul(strrev(test1),strrev(test2));

   system("PAUSE");

   return 0;

}

 

 

 

//大数相乘

void Mul2(char* num1,int len1,

        char*num2, int len2 {

    int slen =len1+len2;

    char* temp =(char*)malloc(slen);

    char* s =(char*)malloc(slen);

    int i, j;

    int start;

    //将第二个数的每一位与第一个数相乘并加到结果中

    for(i=0;i<len2; ++i) {

       memset(temp, 0, len1+len2);

        start =slen-1-i;

       //将第二个数的每一位与第一个数相乘

        for(j=0;j<len1; ++j) {

           temp[start-j] = num1[len1-1-j]*num2[len2-1-i];

        }

       //处理相乘后的结果,该进位的进位

       for(j=start; j>=start-len1; --j) {

           if(temp[j] >= 10) {

               temp[j-1] += temp[j]/10;

               temp[j] %= 10;

            }

        }

       //将结果加到总结果中

       for(j=start; j>=start-len1; --j) {

            s[j]+= temp[j];

        }

       //处理总结果进位

       for(j=start; j>=start-len1; --j) {

           if(s[j] >= 10) {

            }

        }

    }

    for(i=0;i<slen; ++i) {

       printf("%d", s[i]);

    }

}


C语言面试题大汇总 (图像处理方向)

C语言面试题大汇总 (图像处理方向)      C语言面试题大汇总        1、局部变量能否和全局变量重名?    答:能,局部会屏蔽全局。要用全局变量,需要使用"::"...
  • chenjie863
  • chenjie863
  • 2013年11月07日 21:29
  • 5750

图像处理职位面试题(图像处理+c++)

http://www.csdn123.com/html/blogs/20131030/91194.htm 【试题汇总】图像处理职位面试题库笔试题汇总(1) 返回脚本百事通 M...
  • u014114990
  • u014114990
  • 2015年08月24日 13:56
  • 11421

C/C++ 笔试、面试题目大汇总(一)

这些东西有点烦,有点无聊。如果要去C++面试就看看吧。几年前网上搜索的。刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善。 1.求下面函数的返回值( 微软) int func(...
  • u014744118
  • u014744118
  • 2015年10月08日 14:10
  • 1430

信大捷安的笔试题(c/c++)

二.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上在想吃时,就只剩...
  • lijingyi2011
  • lijingyi2011
  • 2014年11月22日 13:27
  • 3245

设计模式C++学习笔记之十一(c/c++面试笔试题)

一、指针与引用有什么区别? 1、指针会占用内存,引用不占用内存。 2、引用在定义时必须初始化。 3、没有空的引用,但是有空的指针。 二、static关键的几个作用 1、函数体内的static变量的...
  • a854073071
  • a854073071
  • 2016年05月03日 22:02
  • 2279

每天一道C\C++笔试题V---内存泄露

俗语云:出来混,迟早是要还的。 下面是一道初级内存泄露题,程序员小懒儿显式的用new动态分配了内存,却忘记了用delete释放。 请找出问题的所在,代码如下: #include #incl...
  • lincyang
  • lincyang
  • 2013年03月07日 22:08
  • 3746

C/C++经典笔试题(之一)

要求输入一个句子,将其单词逆序。 例:输入:you are so beautiful 输出:beautiful so are you   #include #include #inclu...
  • cyujust
  • cyujust
  • 2012年11月17日 14:31
  • 611

C/C++基础笔试题1.1.2(运算符十问之解)

继上一次的十问的解答。
  • u011044759
  • u011044759
  • 2014年07月17日 13:43
  • 2321

2011东软校园招聘笔试题部分知识点总结——语言部分(C/C++)

如题,这里简要总结一下今年东软校园招聘笔试题中的一些知识点。东软的笔试题一共有两套,第一套称之为通用能力测试,其实就是智力题。第二套称之为专业能力测试,其实就是计算机专业知识的题。这里总结的一些内容主...
  • RealCoolGod
  • RealCoolGod
  • 2011年09月17日 16:42
  • 2531

中兴通讯C++/C笔试题及答案

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 ...
  • xq2768637066
  • xq2768637066
  • 2016年01月29日 14:06
  • 922
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔试题汇集之大数处理篇(C/C++)
举报原因:
原因补充:

(最多只允许输入30个字)