大数问题

相加:

#include<iostream.h>
void main()
{
 int na,nb;
 cout<<"input na:";
 cin>>na;
 cout<<"input nb:";
 cin>>nb;
 int max=(na>nb)?na:nb;
 char *a;
 a=new char[max+1];
 char *b;
 b=new char[max+1];
 if(max==na)
 {
  a[0]='0';
  cout<<"input a:";
  for(int i=1;i<=na;i++)
   cin>>a[i];
  for(int s=0;s<na-nb+1;s++)
   b[s]='0';
  cout<<"input b:";
  for(int j=na-nb+1;j<=max;j++)
   cin>>b[j];
 }
 else
 {
  b[0]='0';
  cout<<"input a:";
  for(int s=0;s<nb-na+1;s++)
   a[s]='0';
   for(int j=nb-na+1;j<=max;j++)
   cin>>a[j];
  cout<<"input b:";
  for(int i=1;i<=nb;i++)
   cin>>b[i]; 
 }
 char *c;
 c=new char[max+1];
 for(int h=0;h<=max;h++)
  c[h]='0';
 int flag=0;
 c[max]+=(a[max]-'0')+(b[max]-'0');
 for(int k=max;k>=0;k--)
 {  
  flag=0;
     if (c[k]-'0'>=10)
  {
   flag=1;
     c[k]-=10;
     c[k-1]=(a[k-1]-'0')+(b[k-1]-'0')+flag+'0';
  }
     else
  {
   c[k-1]=(a[k-1]-'0')+(b[k-1]-'0')+'0';
  }
 }
 for(int l=0;l<=max;l++)
 {
  cout<<c[l];

 }
}

http://acm.zju.edu.cn/show_problem.php?pid=1292
大数相加,格式应该是先给出block数,然后每个block以0结尾,求每个block的大数的和.我没有理解错吧?
我的代码是这样的:
#include <iostream.h>
const int MAX=200;
int main()
{
int i,j;
int n;
int a[MAX];
char ach[105];
cin>>n;
for (i=0;i<n;i++)
{
if (i!=0)
{
cout<<endl;
}
for (j=0;j<MAX;j++)
{
a[j]=0;
}
int num=0;
int len=0;
char ch;
cin>>ch;
while (ch!='0')
{
for (j=0;j<105;j++)
{
ach[j]=' ';
}

num=0;
while (ch!='')
{
ach[num]=ch;
num++;
cin.get(ch);
}
if (num>len)
len=num;
for (j=num-1;j>=0;j--)
{
a[num-j-1]+=int(ach[j]-48);
}
for (j=0;j<=len;j++)
{
if (a[j]>9)
{
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
}
if (a[len+1]>0)
len++;
cin.get(ch);
}
if (a[len]!=0)
cout<<a[len];
for (j=len-1;j>=0;j--)
{
cout<<a[j];
}
cout<<endl;

}
return 0;
}
测试也对,但是老是WA.郁闷.

相乘:

/*********************************
* 两个超大数相乘算法
*********************************/

#i nclude
void main()
{
int a[30],b[30],c[60];
int i,j;

/* 给乘数和被乘数赋值,并把结果赋零 */
for (i=0;i<30;i++)
{
a[i]=i%10;
b[i]=i%10;
c[2*i]=0;
c[2*i+1]=0;
}

/* 给每位结果赋值,这里应该考虑清楚为什么这么写
还有这里的位的值的最大限度应该是-128 -- +127
所以就算是10*10也可以满足存进去一个char类型里 */
for(i=0;i<30;i++)
for(j=0;j<30;j++)
c[i+j]+=a[i]*b[j];
/* 这里把每个位>10的数进位和把余数重新赋值给这一位 */
for(i=0;i<59;i++)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}

/* 打印出来 */
for(i=0;i<30;i++)
printf("%d",a[30-i-1]);

printf("/n");

for(i=0;i<30;i++)
printf("%d",b[30-i-1]);

printf("/n");

for(i=0;i<60;i++)
printf("%d",c[60-i-1]);

printf("/n");

}

两整数相乘,一般计算过程(相乘、移位、相加)如下:

          4321
   ×)    999
      ----------
        38889
      38889
    38889
     ----------
    4316679

模拟该过程的C语言代码如下(整数在数组中逆序存放,结果是正序输出的,数组中每个元素用来存放整数中的每一位):

#i nclude <conio.h>
#i nclude <stdlib.h>

void product(int x[],int y[],int z[],int n,int m)
{
   int i,j;
   for(i=0;i<n+m-1;i++)
      z[i]=0;
   for(i=0;i<n;i++)
      for(j=0;j<m;j++)
          z[i+j]=z[i+j]+x[i]*y[j];
}

void chuli(int z[],int result[],int n)
{
   int i;
   int c=0;
   for(i=0;i<n;i++)
   {
     result[i]=(z[i]+c)%10;
     c=(z[i]+c)/10;
   }
   if(c!=0)
      result[i]=c;
   else
      result[i]=0;
}

void output(int array[],int n)
{
   int i;
   printf("/n");
   for(i=n;i>=0;i--)
      printf("%d",array[i]);
}

void main()
{
  int x[4]={1,2,3,4},y[3]={9,9,9},z[6],result[7];
  int i;
  product(x,y,z,4,3);
  chuli(z,result,6);
  clrscr();
  printf("/nThe first digital is:/n");
  output(x,3);
  printf("/nThe second digital is:/n");
  output(y,2);
  printf("/nThe result product is:/n");
  output(result,6);
}

 

/**************************************
    算法复杂度为:O(longhta*longthb)
    longtha为乘数的位数
    longhtb为被乘数的位数
***************************************/

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define LEN 1000
void mult(char [],char [],char []);
main()
{
    char op1[LEN],op2[LEN],op3[LEN*2-1];
    scanf("%s%s",op1,op2);
    mult(op1,op2,op3);
    printf("%s/n",op3);
    getch();
    return 0;   
}    
void reverse(char a[])
{
    int longth=strlen(a);
    int i;
    for(i=0;i<longth/2;i++){
        char t;
        t=a[i];
        a[i]=a[longth-i-1];
        a[longth-i-1]=t;
    }
}
void mult(char op1[LEN],char op2[LEN],char ans[LEN*2-1])
{
    char top1[LEN];
    char top2[LEN];
    strcpy(top1,op1);
    strcpy(top2,op2);
    reverse(top1);
    reverse(top2);
    int k;
    for(k=0;k<strlen(top1)+strlen(top2);k++){
        ans[k]='0';
    }
    int i,j;
    int jw,ys;
    int longth;
    for(j=0;j<strlen(top2);j++){
        jw=0;
        for(i=0;i<strlen(top1);i++){
            ys=((top1[i]-'0')*(top2[j]-'0')+jw+ans[i+j]-'0')%10;
            jw=((top1[i]-'0')*(top2[j]-'0')+jw+ans[i+j]-'0')/10;
            ans[i+j]=ys+'0';
        }
        if(jw>0){
            ans[i+j]=jw+'0';
        }
    }
    longth=i+j-1;
    if(jw>0)
        ans[longth++]=jw+'0';
    ans[longth]='/0';
    reverse(ans);
}

/****************************************/
/*程序 pku1001*/
/*作者: S.Klaus */
/*日期:2005-7-5*/
/*调试:VC6*/
/****************************************

****************************************/


/*头函数 */
#include<iostream.h>

#include<iomanip.h>
#include<stdlib.h>
#include<string.h>

#define max 10000
/***************************************/
int fmul(char s1[],char s2[]);
/***************************************/

char sum[max];
char result[max];

/***************************************/
/*子函数计算两个数的乘积*/
int fmul(char s1[],char s2[])
{
   int ls1,ls2;//用于存储长度,进位信息
   int i=0,j,p,q,m;
   int k=0,flag;
   char mid[max];
   //char sum[max];
   ls1=strlen(s1);
   ls2=strlen(s2);
   //反向
   j=ls1-1;
   while(j>=0)
   {
    mid[i++]=s1[j--];
   }
   mid[i]=s1[ls1];
   strcpy(s1,mid);
   i=0;
   j=ls2-1;
   while(j>=0)
   {
    mid[i++]=s2[j--];
   }
   mid[i]=s2[ls2];
   strcpy(s2,mid);
 //  cout<<s1<<endl<<s2<<endl;
   //计算
   for(i=0;i<max;i++)
   {
    sum[i]='0';
   }
    i=j=k=0;
 flag=0;
 p=0;q=0;
   while(s2[i]!='/0')
 {
    flag=0;
     m=q;
  for(m=0;m<q;m++)
  {
   mid[m]='0';
  }
  p=m;
        while(s1[j]!='/0')
  {
           k=(s1[j]-'0')*(s2[i]-'0');
     mid[p]=(flag+k)%10+'0';
     flag=(flag+k)/10;
     j++;p++;
  }
  if(flag!=0){mid[p++]=flag+'0';}
        mid[p]='/0';
  flag=0;
  p=0;
//*********************************************/  
  if(i==0)
  {
   while(mid[p]!='/0')
   {
    sum[p]=mid[p];
    p++;
   }
  }
  else
  {  
     while(mid[p]!='/0')
   {
     k=(sum[p]-'0')+(mid[p]-'0');
                 sum[p]=(k+flag)%10+'0';
     flag=(k+flag)/10;
     p++;
    
   }
    if(flag!=0)
    {
   sum[p++]=flag+'0';
   flag=0;
    }
  }
  j=0;
  i++;q++;
 }
   sum[p]='/0';
   i=0;j=0;
   strcpy(mid,sum);
   p-=1;
   while(p>=0)
   {
    sum[j]=mid[p];
    p--;
    j++;
   }
   sum[j]='/0';
   return 0;
}
/***************************************/
/***************************************/

/***************************************/
/*主函数*/

int main()
{
  

  return 0;
}

 

 

/****************************************/
/*程序 pku1001*/
/*作者: S.Klaus */
/*日期:2005-7-5*/
/*调试:VC6*/
/****************************************

****************************************/


/*头函数 */
#include<iostream.h>

#include<iomanip.h>
#include<stdlib.h>
#include<string.h>

#define max 10000
/***************************************/
int fmul(char s1[],char s2[]);
/***************************************/

char sum[max];
char result[max];

/***************************************/
/*子函数计算两个数的乘积*/
int fmul(char s1[],char s2[])
{
   int ls1,ls2;//用于存储长度,进位信息
   int i=0,j,p,q,m;
   int k=0,flag;
   char mid[max];
   //char sum[max];
   ls1=strlen(s1);
   ls2=strlen(s2);
   //反向
   j=ls1-1;
   while(j>=0)
   {
    mid[i++]=s1[j--];
   }
   mid[i]=s1[ls1];
   strcpy(s1,mid);
   i=0;
   j=ls2-1;
   while(j>=0)
   {
    mid[i++]=s2[j--];
   }
   mid[i]=s2[ls2];
   strcpy(s2,mid);
 //  cout<<s1<<endl<<s2<<endl;
   //计算
   for(i=0;i<max;i++)
   {
    sum[i]='0';
   }
    i=j=k=0;
 flag=0;
 p=0;q=0;
   while(s2[i]!='/0')
 {
    flag=0;
     m=q;
  for(m=0;m<q;m++)
  {
   mid[m]='0';
  }
  p=m;
        while(s1[j]!='/0')
  {
           k=(s1[j]-'0')*(s2[i]-'0');
     mid[p]=(flag+k)%10+'0';
     flag=(flag+k)/10;
     j++;p++;
  }
  if(flag!=0){mid[p++]=flag+'0';}
        mid[p]='/0';
  flag=0;
  p=0;
//*********************************************/  
  if(i==0)
  {
   while(mid[p]!='/0')
   {
    sum[p]=mid[p];
    p++;
   }
  }
  else
  {  
     while(mid[p]!='/0')
   {
     k=(sum[p]-'0')+(mid[p]-'0');
                 sum[p]=(k+flag)%10+'0';
     flag=(k+flag)/10;
     p++;
    
   }
    if(flag!=0)
    {
   sum[p++]=flag+'0';
   flag=0;
    }
  }
  j=0;
  i++;q++;
 }
   sum[p]='/0';
   i=0;j=0;
   strcpy(mid,sum);
   p-=1;
   while(p>=0)
   {
    sum[j]=mid[p];
    p--;
    j++;
   }
   sum[j]='/0';
   return 0;
}
/***************************************/
/***************************************/

/***************************************/
/*主函数*/

int main()
{
  

  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值