Free考研资料 - 免费考研论坛

 找回密码
 注册
打印 上一主题 下一主题

我写的上海交大的一道复试题(powerful calcultor)

[复制链接]
跳转到指定楼层
楼主
haizzz 发表于 08-7-25 10:25:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目翻译过来就是要实现一个超长数的计算问题。因为好长时间没有用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;
        }
}
沙发
s5279551 发表于 08-7-25 12:00:36 | 只看该作者
-48是什么意思啊?加减运算的话应该数组直接就很好算啊。乘法该可以用转换成二进制的,再寄存器求解吧,时间复杂度还会低些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系我们|Free考研资料 ( 苏ICP备05011575号 )

GMT+8, 24-11-19 06:35 , Processed in 0.096935 second(s), 12 queries , Gzip On, Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表