题目翻译过来就是要实现一个超长数的计算问题。因为好长时间没有用c写程序了手头又没有c的教材,对用c语言操作文件的函数全忘了,所以没有全部按题目的要求输入输出都用文件操作而是改成了从键盘输入,还请哪位兄弟把这部分给加上(谢谢^_^)。
声明:绝对是在没有看任何参考答案下自己想的,肯定还有可以改进的地方还请大家赐教!
在VC 6.0 下调试通过!
#include <stdio.h>
#define MAX 255
void Add(int a[],int b[],int l1,int l2);
void Sub(int a[],int b[],int l1,int l2);
void Mul(int a[],int b[],int l1,int l2);
void Clear();
//为了便于计算时的进位我把计算数在存入数组时都倒置了
void TransOrder(char s[], int a[],int l);
int a[MAX],b[MAX],c[MAX];
void main()
{
int i=0;
char s1[MAX],s2[MAX];
int length1=0,length2=0;//操作数的长度
printf("Please input first number:");
do
{
scanf("%c",&s1);
i++;
}while(s1[i-1]!='\n');
length1=i-1;//遍历时的循环应写成for(int i=0;i<length1;i++);
i=0;
printf("\nPlease input secend number:");
do
{
scanf("%c",&s2);
i++;
}while(s2[i-1]!='\n');
length2=i-1;
i=0;
Clear();
TransOrder(s1,a,length1);
TransOrder(s2,b,length2);
printf("a * b =");
Mul(a,b,length1,length2);
printf("a + b =");
Add(a,b,length1,length2);
/*如果这里不加上TransOrder(s1,a,length1);和TransOrder(s2,b,length2)计算a-b就会出错,不光是a-b,只要是把a*b或a+b的函数放到这个位置前面不加转换的函数都会出错。我用调试器跟了一下,发现在执行第三个计算函数时a[]中的值被改变了,可为什么会被更改我却不知道,如果谁知道了还请告诉我一声,3Q*/
TransOrder(s1,a,length1);
TransOrder(s2,b,length2);
printf("a - b =");
Sub(a,b,length1,length2);
return ;
}
void TransOrder(char s[],int a[],int l)
{
int i=0;
for(i=0;i<l/2;i++)
{
a=(int)s[l-i-1]-48;
a[l-i-1]=(int)s-48;
}
if(l%2!=0)
a[l/2]=(int)s[l/2]-48;
}
void Add(int a[],int b[],int l1,int l2)
{
int len=l1<l2?l2:l1;
int temp=0;
for(int i=0;i<MAX;i++)
c=0;
for(i=0;i<len;i++)
{
temp=a+b;
if(temp>9)
{
c=temp%10;
a[i+1]+=1;
}
else
c=temp;
}
for(i=len-1;i>=0;i--)
printf("%d",c);
printf("\n");
}
void Sub(int a[],int b[],int l1,int l2)
{
int len=l1<l2?l2:l1;
int temp=0;
for(int i=0;i<MAX;i++)
c=0;
if(l1>=l2)
{
for(int i=0;i<len;i++)
{
if(a<b)
{
a[i+1]-=1;
a+=10;
c=a-b;
}
else
c=a-b;
}
}
else
{
for(int i=0;i<len;i++)
{
if(b<a)
{
b[i+1]-=1;
b+=10;
c=b-a;
}
else
c=b-a;
}
c[i-1]*=-1;
}
for(i=len-1;i>=0;i--)
printf("%d",c);
printf("\n");
}
void Mul(int a[],int b[],int l1,int l2)
{
int k1=0,k2=0;//用来记录两个数组中前面连续的零的个数
int i=0,j=0,k=0,index=0;
int temp=0;
for(i=0;i<MAX;i++)
c=0;
i=0;
while(a==0)
{
k1++;
i++;
}
i=0;
while(b==0)
{
k2++;
i++;
}
//把a,b中的0去掉后再进行相乘
//拿a中的每一项与b中的每一项相乘结果存入c相对应的位置中
//因为是乘法运算所以在存入c中时每次都要与当前位置上的c数组元素进行一次加法运算
for(i=k1,k=0;i<l1;i++,k++)
{
for(j=k2,index=0;j<l2;j++,index++)
{
temp=a*b[j];
int t=0,jinwei=0;
if(temp>9)
{
c[k+index]+=temp%10;
if(c[k+index]>9)
{
t=c[k+index];
c[k+index]=t%10;
c[k+index+1]+=1;
int jinwei=1;
while(c[k+index+jinwei]>9)
{
t=c[k+index+jinwei];
c[k+index+jinwei]=t%10;
c[k+index+jinwei+1]+=1;
jinwei++;
}
}
c[k+index+1]+=temp/10;
jinwei=1;
while(c[k+index+jinwei]>9)
{
t=c[k+index+jinwei];
c[k+index+jinwei]=t%10;
c[k+index+jinwei+1]+=1;
jinwei++;
}
}
else
{
if(c[k+index]+temp>9)
{
jinwei=1;
t=c[k+index];
c[k+index]=(t+temp)%10;
c[k+index+1]+=(t+temp)/10;
while(c[k+index+jinwei]>9)
{
t=c[k+index+jinwei];
c[k+index+jinwei]=t%10;
c[k+index+jinwei+1]+=1;
jinwei++;
}
}
else
c[k+index]+=temp;
}
}
}
for(i=c[k+index-1]==0?k+index-2:k+index-1;i>=0;i--)
printf("%d",c);
for(i=0;i<k1+k2;i++)
printf("%d",0);
printf("\n");
}
void Clear()
{
for(int i=0;i<MAX;i++)
{
a=b=c=0;
}
} |