| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1780 人关注过本帖
标题:大数的乘法
只看楼主 加入收藏
小烧饼
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-12-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:16 
大数的乘法
程序代码:
#include <stdio.h>
#include <string.h>

int main()
{
    char s[105],t[105];
    int a[105]={0},b[105]={0},i,j,al,bl,n=1,c[205]={0};
    gets(s);
    gets(t);
    al=strlen(s);
    bl=strlen(t);
    if(s[0]=='0'||t[0]=='0')
    {
        printf("0");
        goto end;
    }
    for(i=0;s[i]!='\0';i++)
    {
        a[al-i-1]=s[i]-'0';
    }
    for(i=0;t[i]!='\0';i++)
    {
        b[bl-i-1]=t[i]-'0';
    }
    for(i=0;i<bl;i++)
    {
        for(j=0;j<al;j++)
        {
           c[j]=a[j]*b[i]*n+c[j];
        }n=n*10;
    }
    for(i=0;i<al-1;i++)
    {
        if(c[i]>=10)
        {
            c[i+1]=c[i+1]+c[i]/10;
            c[i]=c[i]%10;
        }
    }
    while(c[i]>0)
    {
       c[i+1]=c[i]/10;
       c[i]=c[i]%10;
       i++;
    }
    for(j=0;j<i;j++)
    {
        printf("%d",c[i-j-1]);
    }
    end:printf("\n");
    return 0;
}
[local]1[/local]


])G}R5INH]]R{9C_7W77{A1.png (6.48 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: color 
2017-03-13 16:57
小烧饼
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-12-17
收藏
得分:0 
这个程序为什么不对?
2017-03-13 16:58
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:0 
具体有什么不对不说清楚让别人帮你猜吗?

未佩好剑,转身便已是江湖
2017-03-13 18:02
小烧饼
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 3楼 alice_usnet
输入的数过大就不行啦
2017-03-13 18:09
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:0 
那就再优化嘛

未佩好剑,转身便已是江湖
2017-03-13 19:51
mnmn4429
Rank: 4
等 级:业余侠客
帖 子:64
专家分:245
注 册:2017-2-21
收藏
得分:0 
做的已经很好了,要想觉得做的完美,可以去考虑n=n*10;这儿去优化,你的逻辑有些深,自己去想想办法
2017-03-13 20:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
最近学习数据结构栈和队列~这题是很好的练笔~九九也来露一手~
可以计算任意位数(理论上)的大数乘法~~~~~~~~~~~~

程序代码:
#include<stdio.h>
#include<stdlib.h>

#define LEN_Stack sizeof(Stack)
#define LEN_Queue sizeof (Qnode)

typedef struct Stack     //
{
    int n;              
    struct Stack* next;
}Stack;

typedef struct Qnode    //队列
{
    int n;
    struct Qnode* next;

}Qnode,*QnodePrt;

typedef struct
{
    QnodePrt front;
    QnodePrt rear;
}LinkQueue;

 
Stack* Stack_creat();                   //创建一个栈
void Stack_in(Stack** stack,int n);     //入栈
void Stack_out(Stack** stack);          //出栈
int Stack_empty(Stack* stack);          //判断栈空
void Stack_destory(Stack** stack);      //销毁栈

void Stack_input(Stack** stack);  //输入数据
void Stack_output(Stack* stack);  //输出数据

QnodePrt Queue_creat();                 //创建一个队列
void Queue_in(LinkQueue* queue,int n);         //入队
void Queue_out(LinkQueue* queue);              //出队
int Queue_empty(LinkQueue* queue);      //判断队列空
//void Queue_destory(LinkQueue* queue);   //清空队列

//void Queue_output(LinkQueue* queue);    //输出队列


void fun();                            //主要执行流程

void product(Stack* p2);              //乘积
void carry(LinkQueue* queue);         //进位
void save(QnodePrt* p2);              //保存数据
void show_result();                   //输出结果   

Stack* a=NULL;
Stack* b=NULL;
Stack* stack_result=NULL;    

LinkQueue queue={0};
LinkQueue queue_result={0};

int main()
{
                       //初始化数据
    Stack_input(&a);  
    Stack_input(&b);

    fun();

    return 0;
}

void fun()
{
    QnodePrt p3=NULL;

    while (!Stack_empty(b))
    {
        product(b);            //计算乘积
        Stack_out(&b);         //出栈
        carry(&queue);         //进位

        save(&p3);             //保存数据
        carry(&queue_result);  //进位
    }

    show_result();

    Stack_destory(&a);            //释放空间
    Stack_destory(&stack_result);
}

Stack* Stack_creat()
{
    Stack* stack=(Stack* )malloc(LEN_Stack);

    if (stack==NULL)
    {
        fprintf(stderr,"入栈失败!\n");
        exit(0);
    }

    return stack;
}

void Stack_in(Stack** stack,int n)
{
    Stack* p=Stack_creat();
    
    p->n=n;
    p->next=*stack;
        
    *stack=p;
}

void Stack_out(Stack** stack)  //出栈
{
    Stack* p=*stack;
    
    if (*stack==NULL)
        return ;
    
    *stack=(*stack)->next;
    
    free(p);
}

int Stack_empty(Stack* stack)  //判断栈空
{    
    return stack==NULL;
}

void Stack_destory(Stack** stack)   //释放栈
{
    Stack* p=*stack;
    
    if (p==NULL)
        return ;
        
    while (p)
    {
        *stack=(*stack)->next;
        free(p);

        p=*stack;
    }

    *stack=NULL;
    return ;
}

void Stack_input(Stack** stack)  //输入数据
{
    char c=0;

    while (c!='\n')
    {
        c=getchar();

        if (c>='0'&&c<='9')
            Stack_in(stack,c-'0');
    }
}

void Stack_output(Stack* stack)  //输出栈数据
{
    Stack* p=stack;
    while (p)
    {
        printf("%d",p->n);
        p=p->next;
    }

    puts("");
}


QnodePrt Queue_creat(LinkQueue* queue)            //创建一个队列
{
    QnodePrt p=(QnodePrt)malloc(LEN_Queue);

    if (p==NULL)
    {
        fprintf(stderr,"入队失败!\n");
        exit(0);
    }

    return p;
}

void Queue_in(LinkQueue* queue,int n)  //入队
{
    QnodePrt p=Queue_creat();

    if (queue->front==NULL)
        queue->front=queue->rear=p;
    else
    {
        queue->rear->next=p;
        queue->rear=p;
    }

    p->n=n;
    p->next=NULL;
}

void Queue_out(LinkQueue* queue)//出队
{
    QnodePrt p=NULL;

    if (queue->front==NULL)
        return ;

    p=queue->front;

    queue->front=queue->front->next;

    free(p);  

}

int Queue_empty(LinkQueue* queue)       //判断队列空
{
    return queue->front==NULL;
}

/*void Queue_destory(LinkQueue* queue)   //清空队列
{
    QnodePrt p=queue->front;
    if (queue->front==NULL)
        return ;

    while (p)
    {
        p=p->next;
        free(queue->front);
        queue->front=p;
    }
}*/

/*void Queue_output(LinkQueue* queue)    //输出队列
{
    QnodePrt p=queue->front;

    while (p)
    {
        printf("%d",p->n);
        p=p->next;
    }

    puts("");
}*/



void product(Stack* p2)     //乘积
{
    Stack* p1=a;   //乘数

    while (p1)
    {
        Queue_in(&queue,(p1->n*p2->n));  //
        p1=p1->next;
    }
}
void carry(LinkQueue* queue)                //进位
{
    QnodePrt p3=queue->front;

    while (p3->next)
    {
        if (p3->n>9&&p3->next)
        {
            p3->next->n+=p3->n/10;
            p3->n%=10;
        }
        p3=p3->next;
    }

    if (p3->n>9)  //考虑最高位是否进位
    {
        Queue_in(queue,p3->n/10);
        p3->n%=10;
    }
}

void save(QnodePrt* p2)               //保存数据
{
    QnodePrt p=NULL;               

    if (*p2!=NULL)
        *p2=(*p2)->next;            //每次计算保留数据都要前移一位

    p=*p2;

    while (!Queue_empty(&queue))
    {
        if (p==NULL)
        {
            Queue_in(&queue_result,queue.front->n);
            p=queue_result.rear;
        }
        else
            p->n+=queue.front->n;

        Queue_out(&queue);           //出队
        p=p->next;
    }

    if (*p2==NULL)
        *p2=queue_result.front;
}

void show_result()  //因为此时queue_result得到的结果是反向的,所以要进行处理
{
    while (!Queue_empty(&queue_result))  
    {
        Stack_in(&stack_result,queue_result.front->n);     //把结果入栈
        Queue_out(&queue_result);                          //出队
    }

    if (stack_result->n==0)                                //考虑第一位数为0的情况
    {
        puts("0");
        return ;
    }

    Stack_output(stack_result);                            //输出数据
}


[此贴子已经被作者于2017-3-14 03:56编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-14 03:30
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
以下是引用小烧饼在2017-3-13 18:09:52的发言:

输入的数过大就不行啦

是不是超出了int类型做累加容器的限制。
要扩展,可以按逐位乘结果转为加法处理,这样累加器用char类型就可以。
2017-03-14 05:59
小烧饼
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 7楼 九转星河
真心看不懂
2017-03-14 09:02
小烧饼
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-12-17
收藏
得分:0 
回复 8楼 吹水佬
能说的具体一点吗
2017-03-14 09:03
快速回复:大数的乘法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018044 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved