2012-07-18 48 views
0

我想用C++語言編寫g-adic擴展,但無論我嘗試什麼,輸出仍然是錯誤的。讓我先解釋一下g-adic的擴張是什麼。 g-adic擴展是表示數字的一種方式。例如,二進制數字,這是數字的2 adic擴展。而十六進制是16-adic擴展。因此,這裏是我的代碼:在C++編程g-adic擴展

#include <iostream> 
#include <cmath> 
#include <complex> 
#include <valarray> 

using namespace std; 

int main() 
{ 
    int x; 
    int g; 
    cin>>x; 
    cin>>g; 
    int k=log(x)/log(g)+1; 
    int e; 
    int b=0; 
    int* myArray=NULL; 
    myArray=new int[k]; 

    for(int i=0;i<k;i++) 
    { 
     myArray[i]=0; 
    } 

    while(b!=k) 
    { 
     e=x/(g^(k-b-1)); 
     myArray[b]=e; 
     x=x-e*g^(k-b-1); 
     b++; 
    } 

    b=0; 

    while(b!=k) 
    { 
     cout<<myArray[b]<<endl; 
     b++; 
    } 

    delete [] myArray; 
    myArray=NULL; 

    return 0; 
} 

因此,舉例來說,如果我想105轉換成二進制,X = 105,G = 2,k爲新號碼的長度。在這種情況下是7. int e = 105/2 ^(7-1)= 1。這是第一個數字。那麼x = 105-1 * 2 ^(7-1)= 41。如果你手工操作,你會發現105變成了1101001.但是如果我編譯這段代碼,它就不起作用。我的問題是這個代碼有什麼問題?

+0

怎麼樣首先在格式化的代碼? – 2012-07-18 14:51:05

+0

哪個減法首先在這裏完成?:g ^(k-b-1) – 2012-07-18 14:51:15

+1

@Torsten Robitzki:我不知道格式是什麼。 – Badshah 2012-07-18 15:02:21

回答

0

^不做冪。它是獨家運營商。要進行冪運算,請使用pow函數。

e=x/std::pow(double(g),double(k-b-1)); 
myArray[b]=e; 
x=x-e*std::pow(double(g),double(k-b-1)); 

You can see your program in action, with my changes, on IDE One.

+0

oke,現在程序作品,我非常愚蠢的認爲^是指數運算符,但我對此很陌生,所以也許這就是我爲什麼這麼想的原因。非常感謝你 – Badshah 2012-07-18 15:55:16

0

這裏:運行此程序

#include <iostream.h> 
#include <cmath> 
#include<stdlib.h> 
#include<stdio.h> 

int main() 
{ 
    int x; 
    int g; 
    cin>>x; 
    cin>>g; 

    while(x>g) 
    { 
     cout<<x%g<<endl; 
     x/=g; 
    } 
      cout<<x%g<<endl; 

    return 0; 
    } 

作品105和2,不需要數組

+1

是的,你的代碼工作,但我想知道爲什麼我的代碼不起作用。如果我手動執行代碼中的所有內容,我會得到很好的答案,但如果我運行該程序,則不起作用。 – Badshah 2012-07-18 15:07:05

+0

兩個問題:(1)您以相反的順序輸出數字。 (2)當'x == g'時你做錯了事。另外,(3)可以使用'x> 0'作爲測試來避免代碼重複。 – Hurkyl 2012-07-18 15:08:11

+0

我認爲g ^(k-b-1)有一個未定義的行爲。哪首先減法?我現在要去吃點什麼,現在 – 2012-07-18 15:08:38