回 帖 发 新 帖 刷新版面

主题:[原创]NOIP 2006 第4题---讨论

[b] 2^k进制数[/b]
【问题描述】
  设r是个2^k进制数,并满足以下条件:
(1)r至少是个2位的2^k进制数。
(2)作为2^k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
(3)将r转换为2进制数q后,则q的总位数不超过w。
在这里,正整数k(1≤k≤9)和w(k<w≤30000)是事先给定的。
问:满足上述条件的不同的r共有多少个?
  我们再从另一角度做些解释,设S是长度为w的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k的段,每段对应一位2^k进制的数,如果S至少可分成2段,则S所对应的二进制数又可转换为上述的2^k进制数r。
  例:设k = 3,w = 7。则r是个八进制数(2^3=8)。由于w = 7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3左边第一段只有一个二进制位),则满足条件的八进制数有:
  2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6 + 5 +…+1=21个。
  3位数:高位只能是1,第二位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5 + 4 +…+1=15个。
  所以,满足要求的r共有36个。

【输入文件】
输入文件只有1行,为两个正整数,用一个空格隔开:
k w

【输入文件】
  输出文件为1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其它字符(例如空格、换行符、逗号等)。
  (提示:作为结果的正整数可能很大,但不会超过200位)

【输入样例】
3 7

【输出样例】
36
输入:
8 4000
输出:
15789604461865809771178549250434395392663499233282028201972879200395656481971270141183460469231731687303715884105600

回复列表 (共11个回复)

沙发

这是我写的程序:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<memory.h>
#include<time.h>
#define MAX 100

long total[MAX],suab[MAX];
long num=0,lab=0;
unsigned long long number=0;
long k,w;
long pow_2(long n)
{
 long i,sum=1;
 for(i=1;i<=n;i++)
 sum*=2;
 return sum;
}

long jinzi_2k(long mod,long jin)
{
 long jin10=1,jin2k=0,i,j,save;
  for(i=mod-1;i>=1;i--)
  {
     save=1;
     for(j=1;j<=i;j++)
     save*=2;
     jin10+=save;
  }
  jin2k=jin10%jin;

  return jin2k;
}

long new_jiecheng(long min,long max,long *sum)
{
  long i,j,h,l,digit=0;

  sum[0]=min;
  for(i=min+1;i<=max;i++)
  {
    for(j=0;j<=digit;j++)
        sum[j]*=i;
    for(h=0;h<=digit;h++)
     if(sum[h]>=10)
     {
       if(sum[digit]>=10)
             digit++;
         sum[h+1]=sum[h]/10;
         sum[h]=sum[h]%10;

     }
  }

  return digit;
}

int big_bijiao(long *sua,long *sub,long la,long lb)
{
 long i,j;
 for(i=la,j=lb;j>=0;)
 {
  if(sua[i]>sub[j])
  {

   break;
  }
  else if(sua[i]<sub[j])
       {

    break;
    }
    else if(sua[i]==sub[j])
         {
          j--;
          i--;
          }
 }
 if(sua[i]>sub[j]||j<0)
 return 1;
 else if(sua[i]<sub[j])
      return -1;

 return 0;
}

void big_chufa(long sua[],long sub[],long la,long lb)
{
  long i,j,h,r,p,q;
  long ab[MAX];
  memset(suab,0,sizeof(suab));
  lab=0;
  for(i=la;i>=lb;i--)
  {
   for(j=0;j<=10;)
   {
    memset(ab,0,sizeof(ab));
    for(h=0;h<=lb;h++)
    ab[h]=sub[h]*j;
    for(r=0;r<lb;r++)
    if(ab[r]>=10)
    {
     ab[r+1]=ab[r]/10;
     ab[r]=ab[r]%10;
    }
     if(big_bijiao(sua,ab,i,lb)==-1)
     break;
     else
     j++;
    }
   suab[lab++]=j-1;
   for(p=0,q=(i==1)?1:i-lb+1;p<=lb;p++,q++)
   {
    if(sua[q]<ab[p])
    {
     sua[q+1]-=1;
     sua[q]+=10;
    }
    sua[q]-=ab[p];
   }
   sua[i-1]+=sua[i]*10;

  }
}

void big_add()
{
 long p,q,r;
 num = num>lab ? num+1 : lab+1;
 for(p=0;p<=num;p++)
 {
  total[p]+=suab[p];
  if(total[p]>=10)
  {
   total[p+1]+=total[p]/10;
   total[p]%=10;
  }
 }
  if(total[num]==0)
  num--;

}

void compute(long n,long m)
{
  long i,j,ma;
  long sua[MAX],sub[MAX],la=0,lb=0;
  memset(sua,0,sizeof(sua));
  memset(sub,0,sizeof(sub));
  ma=m-n;
  if(ma>=n)
  {
    la=new_jiecheng(ma+1,m,sua);
    lb=new_jiecheng(1,n,sub);
    big_chufa(sua,sub,la,lb);
  }

  else
   {
     la=new_jiecheng(n+1,m,sua);
     lb=new_jiecheng(1,ma,sub);
       /*     big_chufa(sua,sub,la,lb);
    }*/

   /*printf("\narray sua:");
   for(i=la;i>=0;i--)
   printf("%ld",sua[i]);
   printf("\n\narray sub:");
   for(i=lb;i>=0;i--)
   printf("%ld",sub[i]);*/
   big_chufa(sua,sub,la,lb);
   }
   /*printf("\nlater**sua/sub=??????**************\n");
   for(i=lab;i>=0;i--)
   printf("%ld",suab[i]);*/

}


int main()
{
 /*clock_t begin,end;*/
 FILE *in=fopen("zhxdong.in","r");
 FILE *out=fopen("zhxdong.out","w");
 long h,i,j,l,wu,most=0,mod;
 unsigned long long mb,m,ma;
 long wei=0,yumax=0;
 long sub[MAX];
 fscanf(in,"%ld %ld",&k,&w);
 fclose(in); 
/*begin=clock();*/
 most=pow_2(k)-1;
if(most>150)
 {
 if(w%k==0)
  {
   wei=w/k>most?most:w/k;
   for(i=2;i<=wei;i++)
   {
    compute(i,most);
    big_add();
   }
  }
 else if(w%k!=0&&w/k+1>most)
       {
     wei=most;
         for(i=2;i<=wei;i++)
         {
          compute(i,most);
          big_add();
         }
       }
       else
           if(w%k!=0&&w/k+1<=most)
           {
        wei=w/k+1;
        mod=w%k;
            yumax=jinzi_2k(mod,pow_2(k));
            for(i=2;i<=wei-1;i++)
            {
         compute(i,most);
         big_add();
            }
            wu=most-1;
            wei=wei-1;
            for(j=1;wu>=wei&&j<=yumax;j++)
            {

               compute(wei,wu);
               big_add();
               wu--;
            }
       }
     while(total[num]==0)
      {
    num--;
      }
      for(m=num;m>=0;m--)
      fwprintf(out,"%ld",total[m]);
    }

板凳


else
  {
   if(w%k==0)
   {
    wei=w/k>most?most:w/k;
    for(i=2;i<=wei;i++)
    {
     mb=1;
     m=1;
     ma=most-i;
     if(ma>=i)
     {

      for(j=ma+1;j<=most;j++)
      mb*=j;
      for(j=1;j<=i;j++)
      m*=j;
      number+=mb/m;
      }
     else
     {

      for(j=i+1;j<=most;j++)
      mb*=j;
      for(j=1;j<=ma;j++)
      m*=j;
      number+=mb/m;
      }
    }
   }
else if(w%k!=0&&w/k+1>most)
   {
    wei=most;
    for(i=2;i<=wei;i++)
    {mb=1;
     m=1;
     ma=most-i;
     if(ma>=i)
     {

      for(j=ma+1;j<=most;j++)
      mb*=j;
      for(j=1;j<=i;j++)
      m*=j;
      number+=mb/m;
      }
     else
     {

      for(j=i+1;j<=most;j++)
      mb*=j;
      for(j=1;j<=ma;j++)
      m*=j;
      number+=mb/m;
      }
     }
   }
     else if(w%k!=0&&w/k+1<=most)
       {
    wei=w/k+1;
    mod=w%k;
        yumax=jinzi_2k(mod,pow_2(k));
   for(i=2;i<=wei-1;i++)
    {
     mb=1;
     m=1;
     ma=most-i;
     if(ma>=i)
     {

      for(j=ma+1;j<=most;j++)
      mb*=j;
      for(j=1;j<=i;j++)
      m*=j;
      number+=mb/m;
      }
     else
     {

      for(j=i+1;j<=most;j++)
      mb*=j;
      for(j=1;j<=ma;j++)
      m*=j;
      number+=mb/m;
      }
     }
      wu=most-1;
      wei=wei-1;
   for(j=1;wu>=wei&&j<=yumax;j++)
    {mb=1;
     m=1;
     ma=wu-wei;
     if(ma>=wei)
     {

      for(j=ma+1;j<=wu;j++)
      mb*=j;
      for(j=1;j<=wei;j++)
      m*=j;
      number+=mb/m;

     }
     else
     {

      for(j=wei+1;j<=wu;j++)
      mb*=j;
      for(j=1;j<=ma;j++)
      m*=j;
      number+=mb/m;

     }
    wu--;
    }
}

   fprintf(out,"%ld",number);
}
    /*  end=clock();
      printf("\n\nThe program has run %f seconds!",(double)(end-begin)/CLOCKS_PER_SEC);
*/

fclose(out);
return 0;
}

3 楼

error occur at "    fwprintf(out,"%ld",total[m]); ":
cannot convert `const char*' to `const wchar_t*' for argument `2' to `int fwprintf(FILE*, const wchar_t*, ...)' 

4 楼

[quote]error occur at "    fwprintf(out,"%ld",total[m]); ":
cannot convert `const char*' to `const wchar_t*' for argument `2' to `int fwprintf(FILE*, const wchar_t*, ...)' 

[/quote]
这样子是不行的,因为它的位数会超过宽字符的位数(32/64/128),而结果有可能是大于200位!!!

5 楼

这道题,我已经做出来了!

6 楼


我通过筛选法来找素数:
可为什么用链表却比用数组要更多的时间呢?
希望各位牛人指点一下:
程序如下:
NO.1(数组)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<memory.h>
#define MAXV 500000001
#include<math.h>
int main()
{
  clock_t end,begin;
  long prime[MAXV];
  long i,j,k,m,n,num=0;
   
  scanf("%ld",&n);
  begin=clock(); 
  k=(long)sqrt(n);

  for(i=3;i<=n;i+=2)

  prime[i]=1;
  for(i=3;i<=k;i+=2)
  {
    if(prime[i])
    for(j=2*i;j<=n;j+=i)
     prime[j]=0;
  }
  for(m=3;m<=n;m+=2)
  if(prime[m])
  num++;
  printf("\n%ld",num+1);
  end=clock();
 printf("\n\nRUN %f SECONDS!",(double)(end-begin)/CLOCKS_PER_SEC);  
 return 0;
}

NO.2(链表)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
long N;
typedef struct prime
{
 long data;
 struct prime *next;
}PRI;

 PRI *creat_list(PRI *head)
 {
   PRI *po,*nw;
   long i;
   po=head;
   nw=(PRI *)malloc(sizeof(PRI));
   nw->data=2;
   nw->next=NULL;
   po->next=nw;
   po=nw;
   for(i=3;i<=N;i+=2)
   {
    nw=(PRI *)malloc(sizeof(PRI));
    nw->data=i;
    nw->next=NULL;
    po->next=nw;
    po=nw;
   }
  return head;
}

PRI *del_data(PRI *head)
{
 long k;
 PRI *s,*e,*m,*pt;
 k=(long)sqrt(N);
 pt=head->next;
 while(pt->next && pt->data<=k)
 {
  s=pt;
  e=pt->next;
  while(e)
  {
   if(e->data%pt->data==0)
   {s->next=e->next;
    e=s->next;
   }
   else
   {
    s=e;
    e=e->next;
   }
  }
  pt=pt->next;
 }
  return head;
}
 void *print(PRI *head)
 {
  PRI *pi;
  pi=head->next;
  printf("\n");
  while(pi)
  {
   printf("%ld ",pi->data);
   pi=pi->next;
  }
 }


int main()
{
 clock_t end,begin;
 PRI *head,*p,*q;
 long num=0;
 printf("Input the number:");
 scanf("%ld",&N);
 begin=clock();
 p=(PRI *)malloc(sizeof(PRI));
 p->next=NULL;
 head=p;
 head=creat_list(head);

 head=del_data(head);
 print(head);

 q=head->next;

print(head);

 while(q)
 {
  num++;
  q=q->next;
 }
 end=clock();
 printf("\nIn the num of %ld has %ld primes!",N,num);
 printf("\nHAS RUN %f seconds!",(double)(end-begin)/CLOCKS_PER_SEC);
 return 0;
}

7 楼

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<memory.h>
#include<time.h>
#define MAX 1000

long total[MAX],suab[MAX];
long num=0,lab=0;
long k,w;
 
long jinzi_2k(long mod,long jin)
{
 long jin10=1,jin2k=0,i,j,save;
  for(i=mod-1;i>=1;i--)
  {
     save=1;
     for(j=1;j<=i;j++)
     save*=2;
     jin10+=save;
  }
  jin2k=jin10%jin;

  return jin2k;
}

long new_jiecheng(long min,long max,long *sum)
{
  long i,j,h,l,digit=0;

  sum[0]=min;
  for(i=min+1;i<=max;i++)
  {
    for(j=0;j<=digit;j++)
        sum[j]*=i;
    for(h=0;h<=digit;h++)
            if(sum[h]>=10)
     {
       if(sum[digit]>=10)
               digit++;
         sum[h+1]+=sum[h]/10;
         sum[h]=sum[h]%10;

               }
  }

  return digit;
}

int big_bijiao(long *sua,long *sub,long la,long lb)
{
 long i,j;
 for(i=la,j=lb;j>=0&&i>=j;)
 {
  if(sua[i]>sub[j])
  {

   break;
  }
  else if(sua[i]<sub[j])
       {

    break;
    }
    else if(sua[i]==sub[j])
         {
          if(j==0)
          break;
                 j--;
          i--;
          }
 }
 if(sua[i]>sub[j])
 return 1;
 else if(sua[i]<sub[j])
      return -1;

 return 0;
}

void big_chufa(long sua[],long sub[],long la,long lb)
{
  long i,j,h,r,p,q,m,n,laa,len;
  long ab[MAX],sab[MAX],saab[MAX];
  memset(sab,0,sizeof(sab));
  memset(suab,0,sizeof(suab));
  memset(saab,0,sizeof(saab));
  laa=0;
  if(sub[lb]==1&&lb==0)
  {
   for(i=0;i<=la;i++)
   suab[i]=sua[i];
   lab=la;
   }
  else
  {
  for(i=la;i>=lb;i--)
  {
   for(j=0;j<=9;)
   {

    memset(ab,0,sizeof(ab));
    for(h=0;h<=lb;h++)
    ab[h]=sub[h]*j;
    for(r=0;r<lb;r++)
    if(ab[r]>=10)
    {
     ab[r+1]+=ab[r]/10;
     ab[r]=ab[r]%10;
    }
     if(big_bijiao(sua,ab,i,lb)==-1)
     break;
     else
    {
    j++;
    for(m=0;m<=lb;m++)
    sab[m]=ab[m];
    }
   }
   saab[laa++]=j-1;

   for(p=0,q=(lb==0)?i:i-lb;p<=lb;p++,q++)
   {
    if(sua[q]<sab[p])
    {
     sua[q+1]-=1;
     sua[q]+=10;
    }
    sua[q]-=sab[p];
   }
   sua[i-1]+=sua[i]*10;
 }
  len=0;
  while(saab[len]==0)
  {
   len++;
   }
  lab=laa-len-1;
  for(m=0,n=laa-1;m<=lab;m++,n--)
  suab[m]=saab[n];
 }
}



void big_add()
{
 long p,q,r;
 num = num>lab ? num+1 : lab+1;
 for(p=0;p<=num;p++)
 {
  total[p]+=suab[p];
  if(total[p]>=10)
  {
   total[p+1]+=total[p]/10;
   total[p]%=10;
  }
 }
  if(total[num]==0)
  num--;

}

void compute(long n,long m)
{
  long i,j,ma;
  long sua[MAX],sub[MAX],la=0,lb=0;
  memset(sua,0,sizeof(sua));
  memset(sub,0,sizeof(sub));
  memset(suab,0,sizeof(suab));
  lab=0;
  ma=m-n;
 if(m>n)
 {
  if(ma>=n)
  {
    la=new_jiecheng(ma+1,m,sua);
    lb=new_jiecheng(1,n,sub);

  }

  else
   {
     la=new_jiecheng(n+1,m,sua);
     lb=new_jiecheng(1,ma,sub);


  }
      big_chufa(sua,sub,la,lb);
 }
 
else
  {
   lab=0;
   suab[0]=1;
   }
 
}


8 楼

int main()
{
 clock_t end,begin;
 FILE *in=fopen("c:\\digital9.in","r");
 FILE *out=fopen("c:\\digital9.out","w");
 long h,i,j,l,wu,most=0,mod,m,ma,mb;
 long wei=0,yumax=0;
 begin=clock();
 fscanf(in,"%ld %ld",&k,&w);
   
 most=(long)pow(2,k)-1;
 
if(w%k==0)
  {
   wei=w/k>most?most:w/k;
   for(i=2;i<=wei;i++)
   {
    compute(i,most);
    big_add();
    }
  }
 else if(w%k!=0&&w/k+1>most)
       {
     wei=most;
         for(i=2;i<=wei;i++)
               {
          compute(i,most);
          big_add();
         }
       }
       else if(w%k!=0&&w/k+1<=most)
           {
        wei=w/k+1;
        mod=w%k;
            yumax=jinzi_2k(mod,(long)pow(2,k));
            for(i=2;i<=wei-1;i++)
            {
                    compute(i,most);
                    big_add();
               
            }
                  wu=most-1;
            wei=wei-1;
            for(j=1;wu>=wei&&j<=yumax;j++)
            {

                    compute(wei,wu);
                    big_add();
               wu--;
                   }
                   }
                  
      for(m=num;m>=0;m--)
      fprintf(out,"%ld",total[m]);
       
      end=clock();
     fprintf(out,"\n\nthe program has run %f seconds!",(double)(end-begin)/CLOCKS_PER_SEC);
      fclose(out);
        return 0;
}

9 楼

楼主,你的错了,
网络搜的标准测试数据
1:3 6/21
2:3 17/119
3:4 1000/32752
4:4 47/32631
5:5 2000/2147483616
6:5 107/2135645927
7:6 107/4141511146315813
8:7 4000/170141183460469231731687303715884105600
9:8 4000/57896044618658097711785492504343953926634992332820282019728792003956564819712
10:2 8/4


#define _INCLUDE_LONGLONG
#include <stdlib.h>
#include <string>

using namespace std;
typedef long long int64;

int pow_2[10]={1,2,4,8,16,32,64,128,256,512};
int jishu=0;
int tmp_ret[512][2000]={0};
string tmp_store[512][4000];
string longtostr(int64 i)
{
    if (i==0) return "";
    char buff[256];
    snprintf(buff,sizeof(buff),"%lld",i);
    return string(buff);
}
void trimleft(string &s,int i)
{
    int l=s.size();
    while ( i-- > l) s="0"+s;
}
string gettmp(string num,int i,int step)
{
    if( num.size() >= i+step ) 
        return num.substr(num.size()-i-step,step);
    else if( num.size() > i ) 
        return num.substr(0,num.size()-i);
    else 
        return "0";
}    
string int64add(string num1,string num2)
{
    string sum;
    if (num1.size() < num2.size())  num2.swap(num1);
    int length=num1.size();
    int jinwei=0;
    int max=0;
    for(int i=0;i<=length;i+=17){
        max=0;
        string tmp1=gettmp(num1,i,17);
        string tmp2=gettmp(num2,i,17);
        if (tmp1.size()==17 || tmp2.size()==17)    max=1;
        int64 inttmp1 = strtoll(tmp1.c_str(),NULL,10);
        int64 inttmp2 = strtoll(tmp2.c_str(),NULL,10);
        string tmpsum=longtostr(inttmp1+inttmp2+jinwei);
        if (max==1 && tmpsum.size()<17 ) trimleft(tmpsum,17);
        if (tmpsum.size()>17){
            jinwei=1;
            tmpsum=tmpsum.substr(tmpsum.size()-17,17);
        }
        else {
            jinwei=0;
        }
        sum=tmpsum+sum;
    }
    return sum;
}
string int64minus(string num1,string num2)
{
    string sum;
    if (num1.size() < num2.size())  num2.swap(num1);
    int length=num1.size();
    int tuiwei=0;
    for(int i=0;i<=length;i+=17){
        string tmp1=gettmp(num1,i,18);
        string tmp2=gettmp(num2,i,17);
        int64 inttmp1 = strtoll(tmp1.c_str(),NULL,10);
        int64 inttmp2 = strtoll(tmp2.c_str(),NULL,10);
        string tmpsum=longtostr(inttmp1-inttmp2-tuiwei);
        if (tmp1.size()==18 && tmpsum.size()>17){
            tuiwei=0;
            tmpsum=tmpsum.substr(tmpsum.size()-17,17);
        }
        else if(tmp1.size()==18 && tmpsum.size()<=17 ){
            tuiwei=1;
        }
        else {
            tuiwei=0;
        }
        sum=tmpsum+sum;
    }
    return sum;
}
void init_ret(int jishu)
{
    int i=jishu;
    while( i-- > 0 ) {
        tmp_store[i][2]=longtostr(jishu-1-i);
        tmp_store[i][2]=int64add(tmp_store[i][2],tmp_store[i+1][2]);
    }
}
void set_number(int weishu)
{
    int j=2;
    while( j++ < weishu ) {
        int i=jishu;
        while( i-- > 1 ) 
            tmp_store[i][j]=int64add(tmp_store[i+1][j-1],tmp_store[i+1][j]);
    }
}
string get_number(int k,int w)
{
    int i=w/k;
    int j=w%k;
    jishu=pow_2[k];
    init_ret(pow_2[k]);

    string count;
    string tmp_count;
    if( j != 0){
        set_number(i+1);
    }
    else {
        set_number(i);
    }
    if(j !=0){
        int num=pow_2[j]-1;
        string tmp_count1=tmp_store[1][i+1];
        string tmp_count2=tmp_store[num+1][i+1];
        tmp_count=int64minus(tmp_count1,tmp_count2);
    }
    for(int n=2;n<=i;n++)
        count=int64add(count,tmp_store[1][n]);
    count=int64add(count,tmp_count);
    return count;
}
int main(int argc, char *argv[])
{
    int k=atoi(argv[1]);
    int w=atoi(argv[2]);

    string ret=get_number(k,w);
    printf("k=%d,w=%d,ret=%s.\n",k,w,ret.c_str());    
    return 0;
}


编译环境 linux环境c++

10 楼

这个就是对的啦:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<memory.h>
#include<time.h>
#define MAX 1000

long total[MAX],suab[MAX];
long num=0,lab=0;
long k,w;
 
long jinzi_2k(long mod,long jin)
{
 long jin10=1,jin2k=0,i,j,save;
  for(i=mod-1;i>=1;i--)
  {
     save=1;
     for(j=1;j<=i;j++)
     save*=2;
     jin10+=save;
  }
  jin2k=jin10%jin;

  return jin2k;
}

long new_jiecheng(long min,long max,long *sum)
{
  long i,j,h,l,digit=0;

  sum[0]=min;
  for(i=min+1;i<=max;i++)
  {
    for(j=0;j<=digit;j++)
        sum[j]*=i;
    for(h=0;h<=digit;h++)
            if(sum[h]>=10)
     {
       if(sum[digit]>=10)
               digit++;
         sum[h+1]+=sum[h]/10;
         sum[h]=sum[h]%10;

               }
  }

  return digit;
}

int big_bijiao(long *sua,long *sub,long la,long lb)
{
 long i,j;
 for(i=la,j=lb;j>=0&&i>=j;)
 {
  if(sua[i]>sub[j])
  {

   break;
  }
  else if(sua[i]<sub[j])
       {

    break;
    }
    else if(sua[i]==sub[j])
         {
          if(j==0)
          break;
                 j--;
          i--;
          }
 }
 if(sua[i]>sub[j])
 return 1;
 else if(sua[i]<sub[j])
      return -1;

 return 0;
}

void big_chufa(long sua[],long sub[],long la,long lb)
{
  long i,j,h,r,p,q,m,n,laa,len;
  long ab[MAX],sab[MAX],saab[MAX];
  memset(sab,0,sizeof(sab));
  memset(suab,0,sizeof(suab));
  memset(saab,0,sizeof(saab));
  laa=0;
  if(sub[lb]==1&&lb==0)
  {
   for(i=0;i<=la;i++)
   suab[i]=sua[i];
   lab=la;
   }
  else
  {
  for(i=la;i>=lb;i--)
  {
   for(j=0;j<=9;)
   {

    memset(ab,0,sizeof(ab));
    for(h=0;h<=lb;h++)
    ab[h]=sub[h]*j;
    for(r=0;r<lb;r++)
    if(ab[r]>=10)
    {
     ab[r+1]+=ab[r]/10;
     ab[r]=ab[r]%10;
    }
     if(big_bijiao(sua,ab,i,lb)==-1)
     break;
     else
    {
    j++;
    for(m=0;m<=lb;m++)
    sab[m]=ab[m];
    }
   }
   saab[laa++]=j-1;

   for(p=0,q=(lb==0)?i:i-lb;p<=lb;p++,q++)
   {
    if(sua[q]<sab[p])
    {
     sua[q+1]-=1;
     sua[q]+=10;
    }
    sua[q]-=sab[p];
   }
   sua[i-1]+=sua[i]*10;
 }
  len=0;
  while(saab[len]==0)
  {
   len++;
   }
  lab=laa-len-1;
  for(m=0,n=laa-1;m<=lab;m++,n--)
  suab[m]=saab[n];
 }
}



我来回复

您尚未登录,请登录后再回复。点此登录或注册