连续的理性分数

时间:2011-10-30 09:32:50

标签: c++ number-theory

以下代码显示我奇怪的错误

 #include<iostream>
    #include<math.h>
    #include<vector>
    using namespace std;
    int gcd(int a,int b) {  return (b==0 ?a:gcd(b,a%b));}
    long long gcd(long a,long b) { return (b==0 ?a:gcd(b,a%b));}
    template<class Int> Int gcd(Int a,Int b) { return (b==0 ?a:gcd(b,a%b));}
    template<class Int>
    struct Triple
    {
      Int d,x,y;
      Triple(Int q,Int w,Int e) :d(q),x(w),y(e) {}

    };

    //extended GCD
    /* computes d=gcd(a,b)
    also x and y such that d=a*x+y*b and return tripls (d,x,y)
                                                                     */
    template<class Int>
    Triple <Int> egcd(Int a,Int b) {

       if(!b) return Triple<Int>(a,Int(1),Int(0));
       Triple<int>q=egcd(b,a%b);
       return Triple<Int>(q.d,q.y,q.x-a/b*q.y);
            }
            /* modular  :inear Equation solver */
       /*  given integer a,b,n solve ax=b(mod n)    

                             create vector,which will be  empthy  in case of no solution
       */
    template<class Int>
     vector<Int>msolve(Int a,Int b,Int n){
             if(n<0){ n=-n;}
             Triple<Int> t=egcd(a,n);
             vector<Int> r;
             if(b%t.d)   return r;
             Int x=(b/t.d*t.x)%n;
             if(x<Int(0)) x+=n;
             for(Int i=0;i<t.d;i++)
                     r.push_back((x+i*n/t.d)%n);
             return r;



     }

     template<class  Int>
     Triple<int>ldioph(Int a,Int b,Int c){
        Triple<Int> t=egcd(a,b);
            if(c%t.d) return Triple<Int>(0,0,0);
            t.x*=c/t.d;t.y*=c/t.d;
            return t;

     }
     /*
     // given a and n ,solves ax=1(mod n)  
             return 0 if  there is no solution
     */
     template<class Int>
     Int inverse(Int a,Int n){

      Triple<Int> t=egcd(a,n);
      if(t.d>Int(1)) return Int(0);
      Int r=t.x%n;
      return (r<Int(0)?r+n:r);


     }

     /*   

       Successive Squaring (for arbitrary power)
       computes b^p mod m,whants p>=0,m>=1;
       if(m is zero)  (which is by default) no modding is done,expect full power

     */
     template<class Int>
     Int  powmod(Int b,Int p,Int m=0){
      vector<bool>bits;
      while(p>0){

       Int np=p/2;
       bits.push_back(np+np!=p);
       p=np;
      }

      Int r=1;
      for(Int i=bits.size()-1;i>=0;i--){
       r*=r; if(m>0) r%=m;
       if(bits[i]) { r*=b;if(m>0) r%=m;}


      }



             return r;

     }
     template<class Int>
     void factor(Int n,vector<Int>&v){
      Int sq=Int(sqrt((double)n));
      for(Int i=2;i<=sq;i++){
          if(n%i) continue;
              v.push_back(i);
              n/=i--;
              sq=Int(sqrt((double)n));



      }
                    if(n>1) v.push_back(n);




     }
     /*  Euler totient function 
       returns number of psoitive integers that are relatively prime to n
                                                                                                                                              */
     int phi(int n){

          vector<int> p;
              factor(n,p);
               for(int i=0;i<(int)p.size();i++){
                    if( i && p[i]==p[i-1]) continue;
                    n/=p[i];
                    n*=p[i]-1;




               }
                       return n;


     }
     /*  returns number of positive  divisors of n
     complexity   : about O(sqrt(n))
     requires : the constructor  Int::Int(double)
     */
     template<class Int>
     Int divisors(Int n){
      vector<int> f;
      factor(n,f);
      int k=f.size();
      vector<Int>table (k+1,Int(0));
      table[k]=Int(1);
        for(int i=k-1;i>=0;i--){

             table[i]=table[i+1];
             for(int j=i+1; ;j++)
                       if(j==k || f[j]!=f[i]){
                              table[i]+=table[j]; break;


                       }

                                             `


            }

             return table[0];


     }
     /* last problem    continuous FrACTIONS OF RATIONALS
     */
     /* complexity of O(logn)*/
     template<class Int>
      void contFract(Int m,Int n,vector<Int>&ans){
         while(n){


                     ans.push_back(m/n);
                      m%=n;
                      m^=n^=m^=n;


             }



      }
    int main(){
                      vector<int>v;
                      vector<int>::iterator it;
                      int m=1000;
                      int n=300;
                         contFract(m,n,v);
                             for(it=v.begin();it!=v.end();it++)
                                     cout<<*it<<"  ";

     return 0;
    }
1>c:\users\datuashvili\documents\visual studio 2010\projects\number_theory\number_theory\number_theory.cpp(160): error C2018: unknown character '0x60'

我无法理解什么是手段,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

源文件的第160行有一个随机`。删除它。