标题:C语言 大整数除法
只看楼主
zxj185552143
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-18
结帖率:0
已结贴  问题点数:20 回复次数:8 
C语言 大整数除法
我们老师要求我们做个大整数除法(c语言),可是真的很有难度,没有办法做出来。上交的时间快到了,到时没作业交就会直接挂科的了!
希望各位大牛能帮忙做一个大整数除法啊!
真的万分感激啊!
搜索更多相关主题的帖子: C语言 除法 整数 
2010-10-24 23:12
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
得分:5 
我有个C++写的。要不啊,用STL链表。

编程的道路上何其孤独!
2010-10-24 23:25
cacker
该用户已被删除
得分:5 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-24 23:42
zxj185552143
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-18
得分:0 
回复 2楼 outsider_scu
发我试试,因为我已经用c语言做了加减乘的了。看看能不能改!
704453946@
2010-10-24 23:57
zxj185552143
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-18
得分:0 
回复 3楼 cacker
c语言的除,很少的!真的很烦人啊!
2010-10-24 23:57
zghnxzdcx
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:550
专家分:1176
注 册:2010-4-6
得分:5 
要找代码就不要来论坛,去百度。

学校里老师的作业,在网上肯定都有答案。

发作业贴,是要被禁言的

你永远不可能战胜一个纯傻子,因为他会把你的智商拉到和他同一个水平,然后用他的丰富经验打败你。
2010-10-25 08:14
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>
#include <list>
using namespace std;
void convert(char *a,list<int> &a1)
{/*转换函数*/
    a1.clear();
    int len=strlen(a);
    int i;
    for(i=0;i<len;i++)
    a1.push_back(a[i]-'0');
    while(*a1.begin()==0) a1.pop_front();
}
void print(list<int> &a)
{   /*打印函数*/
    list<int>::iterator it;
    it=a.begin();
    if(a.empty()) {printf("0\n"); return;}
    for(it;it!=a.end();it++)
        printf("%d",*it);
    printf("\n");
}
void sub(list<int> &a,list<int> &b, list<int> &c)
{ /*大整数的减法*/
    c.clear();
    list<int>::reverse_iterator rita=a.rbegin();
    list<int>::reverse_iterator ritb=b.rbegin();
    short carry=0;
    int temp;
    while(rita!=a.rend()&&ritb!=b.rend())
    {
        temp=*rita-*ritb+carry;
        if(temp<0)
        {
            temp+=10; carry=-1;
        }
        else carry=0;
        c.push_front(temp);
        rita++;
        ritb++;
    }
    while(rita!=a.rend())
    {
        temp=*rita+carry;
        if(temp<0) { temp+=10; carry=-1;}
        else carry=0;
        c.push_front(temp);
        rita++;
    }
    while(*c.begin()==0) c.pop_front();
   
}
bool compare(list<int> &a,list<int> &b)
{   /*大整数的比较*/
    if(a.size()>b.size()) return true;
    else if(a.size()<b.size()) return false;
    else
    {
        list<int>::iterator ita=a.begin(),itb=b.begin();
        while(ita!=a.end())
        {
            if(*ita>*itb) return true;
            else if(*ita<*itb) return false;
            else { ita++; itb++;}
        }
        return true;
    }
}
void divid(list<int> &a,list<int> &b, list<int> &c)
{   /* 大整数的除法*/
     c.clear();
     list<int> row,temp;
     list<int>::iterator ita,itc=c.begin();
     int count;
     for(ita=a.begin();ita!=a.end();ita++)
     {        
         count=0;
         while(*row.begin()==0) row.pop_front();
         row.push_back(*ita);
         while(compare(row,b))
         {
             count++;
             sub(row,b,temp);
             row=temp;
         }
         c.push_back(count);
     }
     while(*c.begin()==0) c.pop_front();
}
   
int main()
{
    char sa[901],sb[901];
    list<int> a,b,c;
    while(scanf("%s%s",sa,sb)==2)   
    {
        convert(sa,a);
        convert(sb,b);
        divid(a,b,c);
        print(c);
    }      
    return 0;
}
这个还算好,只用了STL中的链表。没有用类,也没用运算符重载。。凑合看吧。

编程的道路上何其孤独!
2010-10-25 12:26
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
得分:5 
以下是引用zxj185552143在2010-10-24 23:12:38的发言:

我们老师要求我们做个大整数除法(c语言),可是真的很有难度,没有办法做出来。上交的时间快到了,到时没作业交就会直接挂科的了!
希望各位大牛能帮忙做一个大整数除法啊!
真的万分感激啊!
鄙视你的“万分感激”!因为你就是个弱智、傻蛋、懒汉、瘪三。
2010-10-26 10:07
计本162214
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-1-13
得分:0 
回复 楼主 zxj185552143
#include<iostream>
#include<string>
using namespace std;
int m[210],n[210],e[210];
int sub(int m[],int n[]);
int main()
{
    const int max=200;
    string a,b;
    cin>>a>>b;
    int s=a.length(),k=b.length();
    if(s<k)
    {
        cout<<0<<endl;
    }
    else
    {
        for(int i=0;i<s;i++)
        {
            m[max-s+i]=a[i]-'0';
        }
        for(int i=0;i<k;i++)
        {
            n[max-k+i]=b[i]-'0';
        }
        int w=0;
        int r=s-k;
        int q=0;
        for(int i=0;i<max-r;i++)
        {
            n[i]=n[i+r];
        }
        for(int i=max-r;i<max;i++)
        {
            n[i]=0;
        }
        while(r>=0)
        {
            q=0;
            while(sub(m,n))
            {
                q++;
            }
            e[max-s+k+w-1]=q;
            w++;
            int y=0;
            for(int i=max-1;i>=0;i--)
            {
                m[i]=m[i]+n[i]+y;
                y=0;
                if(m[i]>9)
                {
                    m[i]-=10;
                    y=1;
                }
            }
            for(int i=max-1;i>0;i--)
            {
                n[i]=n[i-1];
            }
            r--;
        }
        int z=0;
        while(e[z]==0)
        {
            z++;
            if(z==max-1)
            {
                break;
            }
        }
        for(int i=z;i<max;i++)
        {
            cout<<e[i];
        }
    }
   
    return 0;
}
int sub(int m[],int n[])
{
    const int max = 200;
    for(int i = max-1;i>=0;i--)
    {
        m[i] = m[i] - n[i];
    }
    for(int i = max-1;i>0;i--)
    {
        if(m[i]<0)
        {
            m[i] += 10;
            m[i-1] -= 1;
        }
    }
    int a = 0;
    while(m[a]==0)
    {
        a++;
        if(a==max-1)
            break;
    }
    if(m[a]<0)
        return 0;
    else
        return 1;
}
2017-01-14 15:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-323890-1-1.html




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

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