在c++中编写一个程序实现进制转换。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c++中编写一个程序实现进制转换。相关的知识,希望对你有一定的参考价值。

由用户输入一个输入数字的进制,从0~20,然后输入数字,然后输入想转成的进制,得到结果,再输入一个想转成的进制,输入0或1结束。注意,例如十六进制中,abcd表示数字,则ABCD也能表示同样的数字。

我说一下思路啊:假设你设置为8进制,输入数字为a=100,你先用a%8得到的是第一位,然后a=a/8;继续a%8得到第二位。。。一直到a/8为0的时候结束就行了 参考技术A 直接输出x%就是16进制的了,你用MFC做很简单,需要详细程序可以联系我追问

不是这样的,是从2进制到20进制都能互相转换

参考技术B #include <iostream>
#include <string>
#include <vector>
#include <sstream>
int main(int argc, char *argv[])

int oriBase,rstBase;
std::string oriNum;
static const char digits[] = "0123456789abcdef";
const char* sd;
char dig;
int x=0;
do
std::cin>>oriBase;
if(oriBase==0||oriBase==1)
break;
std::cin>>oriNum;
std::cin>>rstBase;
if(rstBase==0||rstBase==1)
break;
//任意进制转十进制
for (const char*sc = oriNum.c_str(); (sd = (char *)memchr(&digits[0],
tolower(*sc), oriBase)) != 0; ++sc)

dig = (char)(sd - digits);
x = x * oriBase + dig;

//十进制转任意进制
std::vector<char> rst;
while(x>0)
rst.push_back(digits[x%rstBase]);
x/=rstBase;

//输出
std::copy(rst.rbegin(),rst.rend(),std::ostreambuf_iterator<char>(std::cout));
std::cout<<std::endl;
while(1);
return 0;
参考技术C #include <stdio.h>
#include <string.h>
#include <STDLIB.H>
#include <math.H>
char* DtoAn(double Res, char *Des, int DesType, int Precision)

inti_integer;
doubled_decimal;
charc_integer[1000], c_decimal[1000], idx= 1;
strcpy(Des, "");
if(Res < 0)

Res= -Res;
strcpy(Des, "-");

i_integer= int(Res);
d_decimal = Res- i_integer;
itoa(i_integer, c_integer, DesType);
strupr(c_integer);
strcat(Des, c_integer);
c_decimal[0]= '.';
while(abs(d_decimal) <= 0.000000001 && idx <= Precision)//20表示精度

i_integer= int(d_decimal *= DesType);
if(i_integer >= 0 && i_integer <= 9)
c_decimal[idx++]= i_integer + 0x30;
else
c_decimal[idx++]= i_integer + 0x37;
d_decimal-= i_integer;

c_decimal[idx]= '\0';
return strcat(Des, c_decimal);

double AntoD(double &Des, char *Res, int ResType)

inti, n,
DotNum;
charnewRes[2000], SubDecimal[1000], SubInteger[1000];
doubleret= 0;
for(i= 0, n= 0; Res[i]!='\0'; i++)
if(Res[i]!=' ')

newRes[n++]= Res[i];

newRes[n]= '\0';
strupr(newRes);
if(strstr(newRes, "-")==NULL && strstr(newRes, ".")==NULL)

n= strlen(newRes);
for(Des=0, i= 1; i <= n; i++)
if(newRes[i-1] >= '0' && newRes[i-1] <= '9')
Des+= (newRes[i-1]-0x30)*pow(ResType, n-i);
else
Des+= (newRes[i-1]-0x37)*pow(ResType, n-i);
return Des;

if(strstr(newRes, "-")==NULL && strstr(newRes, ".")!=NULL)

DotNum= 0;
while(newRes[DotNum]!='.') DotNum++;
memcpy(SubInteger, newRes, DotNum);
strcpy(SubDecimal, &newRes[DotNum+1]);
SubInteger[DotNum]= '\0';
n= strlen(SubInteger);
for(Des=0, i= 1; i <= n; i++)
if(newRes[i-1] >= '0' && newRes[i-1] <= '9')
Des+= (SubInteger[i-1]-0x30)*pow(ResType, n-i);
else
Des+= (SubInteger[i-1]-0x37)*pow(ResType, n-i);
n= strlen(SubDecimal);
for(i= 1; i <= n; i++)
if(SubDecimal[i-1] >= '0' && SubDecimal[i-1] <= '9')
Des+= (SubDecimal[i-1]-0x30)*pow(ResType, -i);
else
Des+= (SubDecimal[i-1]-0x37)*pow(ResType, -i);
return Des;

if(strstr(newRes, "-")!=NULL && strstr(newRes, ".")==NULL)

n= strlen(newRes);
for(Des=0, i= 2; i <= n; i++)
if(newRes[i-1] >= '0' && newRes[i-1] <= '9')
Des-= (newRes[i-1]-0x30)*pow(ResType, n-i);
else
Des-= (newRes[i-1]-0x37)*pow(ResType, n-i);
return Des;

DotNum= 1;
while(newRes[DotNum]!='.') DotNum++;
memcpy(SubInteger, newRes, DotNum);
strcpy(SubDecimal, &newRes[DotNum+1]);
SubInteger[DotNum]= '\0';
n= strlen(SubInteger);
for(Des=0, i= 2; i <= n; i++)
if(SubInteger[i-1] >= '0' && SubInteger[i-1] <= '9')
Des-= (SubInteger[i-1]-0x30)*pow(ResType, n-i);
else
Des-= (SubInteger[i-1]-0x37)*pow(ResType, n-i);
n= strlen(SubDecimal);
for(i= 1; i <= n; i++)
if(SubInteger[i-1] >= '0' && SubInteger[i-1] <= '9')
Des-= (SubDecimal[i-1]-0x30)*pow(ResType, -i);
else
Des-= (SubDecimal[i-1]-0x37)*pow(ResType, -i);
return Des;

char* AntoAn(char *Des, int DesType, char *Res, int ResType, int Precision)

double d;
return DtoAn(AntoD(d, Res, ResType), Des, DesType, Precision);

void main()

char res[100];
char des[100];
int restype;
int destype;
printf("请输入要转换的数字:");gets(res);
printf("请输入该数的进制数:");scanf("%d", &restype);
printf("请输入转换的进制数:");scanf("%d", &destype);
printf("转换后的数字是%s\n", AntoAn(des, destype, res, restype, 7) );
参考技术D 这个程序有点麻烦,我有一个挺长的程序,你要不?追问

发一下看看~谢谢啦

追答

下班了给你发哈,你留个邮箱。
程序是一个高精度自定义的数字类型。可以实现任意进制转换,任意长度的数字(正负数字,包括小数)的加、减、乘、除、求幂、求平方根等等。功能有点多的哈哈。。。

追问

343694792@QQ.COM

如何在 C++ 中向字符串中添加字符?

【中文标题】如何在 C++ 中向字符串中添加字符?【英文标题】:How to add characters to strings in C++? 【发布时间】:2020-06-10 21:40:44 【问题描述】:

我正在编写一个 IP 计算器程序来将 IP 地址转换为广播地址、网络地址等。

我需要先将地址转换为 8 位二进制,我已经使用 itoa 进行十进制到二进制的转换,但我仍然需要使其始终为 8 位。

我想用switch 来做这件事。首先程序计算二进制形式的位数,然后使用switch(我把它放在评论中,我需要先弄清楚这个问题)和if它在数字前面添加足够的零(此时实际上是一个字符串)所以它总是 8 个字符长。

我想使用string e1('00',e); 指令在字符串中添加两个零,但它不起作用。 e 是原始字符串,e1 是新的 8 个字符的字符串。它不想编译,停在这一行(string e1('00',e);)并给出:

error: no matching function for call to 'std::__cxx11::basic_string<char>::
basic_string(int, std::__cxx11::string)'|

我的代码:

#include <iostream>
#include <string>
#include <bits/stdc++.h>
using namespace std;
/**
* C++ version 0.4 std::string style "itoa":
* Contributions from Stuart Lowe, Ray-Yuan Sheu,

* Rodrigo de Salvo Braz, Luc Gallant, John Maloney
* and Brian Hunt
*/
std::string itoa(int value, int base)


    std::string buf;

    // check that the base if valid
    if (base < 2 || base > 16)
        return buf;

    enum
    
        kMaxDigits = 35
    ;
    buf.reserve(kMaxDigits); // Pre-allocate enough space.

    int quotient = value;

    // Translating number to string with base:
    do
    
        buf += "0123456789abcdef"[std::abs(quotient % base)];
        quotient /= base;
     while (quotient);

    // Append the negative sign
    if (value < 0)
        buf += '-';

    std::reverse(buf.begin(), buf.end());
    return buf;


int main()

    cout << "Dzien dobry." << endl
         << "Jest OK!\n";
    int a, b, c, d, i, j, k, l, m, n, o, p, r, s, t, u, w, v, x, y, z;

    cout << "Wprowadz pierwszy oktet: ";
    cin >> a;
    cout << "Wprowadz drugi oktet: ";
    cin >> b;
    cout << "Wprowadz trzeci oktet: ";
    cin >> c;
    cout << "Wprowadz czwarty oktet: ";
    cin >> d;
    cout << "Wyswietlam adres IP w postaci dziesietnej: " << a << "." << b << "." << c << "." << d << "\n";
    char res[1000];
    itoa(a, res, 2);
    string e(res);
    itoa(b, res, 2);
    string f(res);
    itoa(c, res, 2);
    string g(res);
    itoa(d, res, 2);
    string h(res);
    //
    x = e.size();
    cout << x << "\n";
    /*
    if (x<8)
    
        switch(x)
        
            case 1: string e(1);
            break;
            case 2: string e(3);
            break;
            case 3: string e(2);
            break;
            case 4: string e(0);
            break;
            case 5: string e(4);
            break;
            case 6: string e(7);
            break;
            case 7: string e(0);
            break;
            default: cout << "error";
        
    

*/
    string e1('00', e);
    cout << e1 << "\n";
    cout << "Wyswietlam adres IP w postaci dwojkowej: " << e1 << "." << f << "." << g << "." << h;

    return 0;

【问题讨论】:

【参考方案1】:

单引号用于单个字符,双引号用于字符串,即多个字符,所以需要"00"

您提供的参数没有std::string构造函数,您可以使用其他方法:

string e1;
e1.append("00").append(e);

或者

string e1 = "00";
e1 += e;

补充说明:

Avoid using #include &lt;bits/stdc++.h&gt;

Avoid using using namespace std;

【讨论】:

非常感谢!字符串 e1 = "00"; e1 += e;效果很好。我使用了“使用命名空间标准”,因为这是他们在学校教给我们的。此处使用了“#include ”,因为编写一段代码以使“itoa”多平台的人使用了它。【参考方案2】:

只需使用++=

std::string foo = "Hello";
std::string bar = foo + " world";

std::cout << bar; // Prints Hello world

您还可以使用+= 就地修改字符串:

std::string foo = "Hello";
foo += " world"; // foo is "Hello world" now

请注意,这会使任何现有的指向foo 中的字符的迭代器无效。您只需再次调用beginend 即可获得新的beginend 迭代器。

【讨论】:

以上是关于在c++中编写一个程序实现进制转换。的主要内容,如果未能解决你的问题,请参考以下文章

ZZNUOJ_用C语言编写程序实现1141:进制转换(附完整源码)

ZZNUOJ_用C语言编写程序实现1144:多种进制(附完整源码)

C++ 编写程序,输入两个数,输出两个数之间的所有数的二进制,三进制,和八进制?

怎样编写一程序:把一个十进制数转换成三进制数啊

请用Python语言编程实现由十进制数到二进制数的转换。

在 C++ 中将十进制转换为二进制年份