数据结构实验之大数相乘

 

这段时间一直非常忙啊。

Why? 到期末了呗,除了复习概率论等课,其它的课程设计接踵而来~。

~

悲剧啊,有木有~

 

数据结构的相对来说是最简单的。

因为老师没抢到好时间,课程设计推迟到了下个学期。

可是。随堂实验还是要交的呀~

 

这次实验内容,就是做两个大数的乘积,括弧 整数 括回。

 

略微把界面做了做,(画外音:明明就是用了几个*点缀呀!

好吧。总之。就是这样了。

 

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;

// arr,brr存两个整数,ans存答案
int arr[10001],brr[10001],ans[10001];

// 求n的逆  比如:n=21345 n的逆为 54312
int fanzhuan( int n )
{
    int num=0;
    while( n>0 )
    {
        num=num*10+n%10;
        n/=10;
    }
    return num;
}

// 转换函数   将一个字符串转换为数组
void convert( int num,string str )
{
    int i,j,k,sum,len;
    len=str.length();
    k=0,j=0;

    if( num==1 )
    {
        sum=0;
        for( i=len-1;i>=0;--i )
        {
            sum=sum*10+(str[i]-'0');
            ++j;
            if( j%4==0 )
            {
                arr[++k]=fanzhuan(sum);
                sum=0;
                j=0;
            }
        }
        if( sum )   arr[++k]=fanzhuan(sum);
        arr[0]=k;
    }
    else
    {
        sum=0;
        for( i=len-1;i>=0;--i )
        {
            sum=sum*10+(str[i]-'0');
            ++j;
            if( j%4==0 )
            {
                brr[++k]=fanzhuan(sum);
                sum=0;
                j=0;
            }
        }
        if( sum )   brr[++k]=fanzhuan(sum);
        brr[0]=k;
    }

}

// 推断输入的数字是否合法
bool judge( string str )
{
    int i,len;
    len=str.length();
    if( !len )  return false;

    for( i=0;i<len;++i )
        if( str[i]<'0' || str[i]>'9' )
            return false;
    return true;
}

// 输入整数 函数
string input( int num )
{
    string str;
    cout<<"请输入第 "<<num<<" 个数据: ";
    cin>>str;

    while( !judge(str) )
    {
        cout<<" 输入数据错误。请又一次输入:"<<endl;
        cin>>str;
    }
    return str;
}

// 正确顺序输出数组内的数字
void print( int flag )
{
    int i;
    // flag为1 输出 arr。flag为2 输出 brr , flag为3 输出ans
    if( flag==1 )
    {
        printf("%d",arr[ arr[0] ]);
        for( i=arr[0]-1;i>0;--i )
            printf("%04d",arr[i]);
    }
    else if( flag==2 )
    {
        printf("%d",brr[ brr[0] ]);
        for( i=brr[0]-1;i>0;--i )
            printf("%04d",brr[i]);
    }
    else
    {
        printf("%d",ans[ ans[0] ]);
        for( i=ans[0]-1;i>0;--i )
            printf("%04d",ans[i]);
    }
}

// 计算乘法
void product( void )
{
    int i,j,temp;
    ans[0]=arr[0]+brr[0];

    for( j=1;j<=brr[0];++j )
    {
        for( i=1;i<=arr[0];++i )
        {
            temp=arr[i]*brr[j]+ans[i+j-1];
            ans[i+j-1]=temp%10000;
            ans[i+j]= ans[i+j]+temp/10000;
        }
    }
    if( ans[ arr[0]+brr[0] ]==0 )   ans[0]-=1;
}




int main()
{
    string str,choice;

    cout<<"*******************欢迎使用大数乘法程序*******************"<<endl;
    cout<<"*                                                        *"<<endl;
    cout<<"*    本程序功能为计算两个整数的乘积,两个数的位数不限    *"<<endl;
    cout<<"*                                                        *"<<endl;
    cout<<"*                     ——————made by tree           *"<<endl;
    cout<<"*                tree's blog -> blog.csdn.net/lttree     *"<<endl;
    cout<<"**********************************************************"<<endl<<endl<<endl;
    do
    {
        // 初始化
        memset(arr,0,sizeof(arr));
        memset(brr,0,sizeof(brr));
        memset(ans,0,sizeof(ans));

        // 输入两个数字
        str=input(1);
        convert(1,str);
        str=input(2);
        convert(2,str);

        // 计算乘积
        product( );

        cout<<"整数: \n";
        print(1);
        cout<<"\n和整数: \n";
        print(2);
        cout<<"\n的乘积为:\n";
        print(3);
        cout<<endl<<endl;

        cout<<"是否继续计算。退出按'N'或'n' : ";
        cin>>choice;
        cout<<"**********************************************************"<<endl;
    }while( !(choice[0]=='N'||choice[0]=='n') );

    return 0;
}


 

posted @ 2016-02-08 10:04  mengfanrong  阅读(544)  评论(0编辑  收藏  举报