论坛首页 入门技术论坛

十进制转化十六进制问题??

浏览 8442 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-04-10   最后修改:2009-04-10
#include <iostream>
#include <string>
#include <math.h>
#include <vector>
using namespace std;
/*
  * 把数字转化为ascii码
  */
  int getChar_Asci(int a){
  	switch (a) {
		case 1:
			a = 49;
			break;
		case 2:
			a = 50;
			break;
		case 3:
			a = 51;
			break;
		case 4:
			a = 52;
			break;
		case 5:
			a = 53;
			break;
		case 6:
			a = 54;
			break;
		case 7:
			a = 55;
			break;
		case 8:
			a = 56;
			break;
		case 9:
			a = 57;
			break;
		default:
			a = 48;
			break;
	}
	return a;
  }
 /*
 * 十进制转化为16进制
 */
 string decimalToHex(int num){
	vector<int> v;
	int digit = num;
	double i =log(digit)/log(16);
	int pluto = i;
	int t = 0;
	for(int i = pluto;i >= 0;i--){
		double d = pow(16,i);
		int j = 1;
		for(;j <= 15;j++){
			int comPare = d*j;
			if(comPare > digit){
				break;
			}
		}
		v.push_back(j-1);
		t += (d*(j-1));
		digit = num - t;
	}
	char *stri = new char[v.size()+1];
//修改的地方:
memset(stri,'\0',v.size()+1);
	for(int i = 0;i < v.size();i++){
		v[i] = getChar_Asci(v[i]);
		stri[i] = v[i];
	}
	cout<<strlen(stri)<<endl;
	string str = "0x";
	str += stri;
	delete stri;
	return str;
}
int main(){
    string str = decimalToHex(100);
    cout<<str;
    system("PAUSE");
} 

为什么strlen(stri)长度为3,比较奇怪。。。。。。。。。。。cout<<strlen(stri)<<endl;
   发表时间:2009-04-10  
上述问题通过研究,再给指针动态分配内存空间,需要初始化,将字符数组扩大可赋值数组长度加1,问题解决。。。。。。。。
0 请登录后投票
   发表时间:2009-04-10   最后修改:2009-04-10
汗一个...
for(int i=28;i>=0;i-=4)
{
		*a++=(num>>i)&15;
}




do
    {
      result[step]="0123456789ABCDEF"[number%16];
      number/=16;
      step++;
    }while(number!=0);



哪个不比你的简单?
0 请登录后投票
   发表时间:2009-04-10   最后修改:2009-04-10
我看了一下,有问题兄弟。。。。。。。。这两个有问题你写多长时间代码了。。。。。。。。
0 请登录后投票
   发表时间:2009-04-10   最后修改:2009-04-10
你下面那个我帮你改了一下:
int main()
{
    /*int t = 0;
    for(int i = 28;i>=0;i-=4){
         t = (>>i)& 15;
         if(t != 0)
          cout<<t<<endl;
    }*/
    char *result = new char[100];
    memset(result,'\0',100);
    int step = 0;
    int number = 63;
    int flag = number;
    do 
    { 
       if(flag >= 16)
       {
                result[step]="0123456789ABCDEF"[flag/16];
               
       }else{
            if(number >= 16){
                     if(number % 16 == 0)
                     {
                         result[step]="0123456789ABCDEF"[flag%16-flag]; 
                     }else
                      {
                          result[step]="0123456789ABCDEF"[number%16];  
                      }
            }else {
                  result[step]="0123456789ABCDEF"[flag%16];
            }
          
       }
      flag/=16;  
      step++;  
    }while(flag!=0);
    cout<<result<<endl; 
     delete result;
    system("PAUSE");
}

不过还是很谢谢你,你这种形式也挺好的,呵呵
0 请登录后投票
   发表时间:2009-04-10   最后修改:2009-04-11
我服了你了,哪里来的那么多废代码?连关键点都提示出来,还写成那样。

上面两种方法都写给你看!

#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include <string>


using namespace System;


int main(array<System::String ^> ^args)
{
    //Console::WriteLine(L"Hello World");
	char result[20];
	int number=10,step=0;
	do  
	 {   
		 result[step]="0123456789ABCDEF"[number%16];   
		 //result[step]="0123456789ABCDEF"[number>=16?number%16:number];   
	    number/=16;   
	    step++;   
	  }while(number!=0); 
		result[step]='\0';
		printf("%s\n",strrev(result));
        //method No.2
		
		number=10;
		for(int i=28;i>=0;i-=4)   
       {   
		   printf("%c","0123456789ABCDEF"[(number>>i)&15]);
		}


 }
0 请登录后投票
   发表时间:2009-04-10  
你会c不?到我这还是编译不了,你程序好滥,我还是帮你改了一下:
//#include <stdafx.h>
#include <stdio.h>
#include <iostream>
#include <string>


using namespace std;  //


int main()
{

char result[20];
int number=10,step=0;
char  * s="0123456789ABCDEF";
do
{
result[step]=s[number%16];
//result[step]="0123456789ABCDEF"[number>=16?number%16:number];
number/=16;
step++;
}while(number!=0); 
result[step]='\0';
printf("%s\n",strrev(result));
//method No.2


system("PAUSE");

}
0 请登录后投票
   发表时间:2009-04-11   最后修改:2009-04-11


给你看看上面那段小程序是怎么编译过的?



你改个屁了,注释掉“<stdafx.h>”? 你还是去找个人手把手教你怎么用vc吧。

程序写得不好,就虚心点,别改点鸡零狗碎的东西来挽回面子。
  • 大小: 174 KB
0 请登录后投票
   发表时间:2009-04-11  
小弟刚学,请多多指教,可能stdafx.h不是标准库吧,在我这没法编译,给个联系方式,大哥
0 请登录后投票
   发表时间:2009-04-11  
ccjsjymg 写道
你会c不?到我这还是编译不了,你程序好滥,我还是帮你改了一下:

在了解别人说的是什么之前先耐心弄清楚是个好习惯,呵呵
ray_linn大大给的代码例子是用C++/CLI写的,需要用VC8或者VC9才可以编译通过,并且需要.NET Framework来运行。虽然如此,实际涉及进制转换部分的代码与标准C++并没有多少区别,稍微修改就能用支持标准C++的编译器编译并运行。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics