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