相加:
#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;
}