100%原创的N进制转换成M进制的C++程序

这是一个原创的C++程序,实现了将任意N进制数转换为任意M进制数的功能。程序利用了高精度和进制转换知识,支持整数和小数的转换,对输入的限制是2 <= N, M <= 36,数据长度不超过10000位。程序包括输入、转换和输出等功能,并提供了详细的错误检查和用户提示。" 105454100,5763203,Django中使用datatables服务器模式分页排序搜索实践,"['前端开发', '后端开发', 'Django框架', 'JavaScript', 'Ajax']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
  本程序的优势与特点:由于之前在网上看到金山公司的招聘上有一条N进制转换成M进制的题目,
  于是我就下定决心要把它做出来。我利用了自己参加ACM比赛时学到的一些知识,运用了高精度
  与基本进制转换的知识,原创了一个N进制转换成M进制的C++程序。它的功能比我在网上看到的
  一些水货“万能进制转换”还要强大。当然,它也有自己的不足之处。源代码如下,有兴趣的
  朋友,可以在如下代码的基础上进行优化与深入。
  本程序解决的问题:把一个N进制的数(data)转换成M进制。
  注:2 <= N, M <= 36;data长度不能超过10000位;
     且仅当M = N^K(K是个正整数)时,data允许带小数部分,否则data只允许是个整数。
  作者:Bennis
  完成日期:2009年4月19日
*/
#define N 10000
#include <iostream>
 using namespace std;
 
 //子函数声明部分。
 void input( int *, int *, char *, bool * );
 int Multiplication( int, int *, int );
 int Power( int *, int, int );
 int Add( int *, int, int *, int );
 int Calculate( int *, int, int, int * );
 int ToDecimal( char *, int *, int, int );
 void ToString( int *, int, char * );
 int Division( int *, int, int, char * );
 int Convertor( char *, char *, int, int, int );
 int EasyConvertion( char *, int *, int, int, int, int );
 void output( char *, char *, int, int, int, bool );

 /*
   函数功能描述:
       主函数,程序的入口。
 */
 int main()
 {
  bool positive = true;
  char *inData = new char[N], *outData = new char[N * 6], length;
  int n, m;
  input( &n, &m, inData, &positive );
  length = Convertor( inData, outData, strlen( inData ), n, m );
  output( inData, outData, n, m, length, positive );
  delete [] inData;
  delete [] outData;
  return 0;
 }

 /*
   函数功能描述:
       输入函数。
   参数说明:
       第一个参数表示N进制的N;
    第二个参数表示M进制的M;
    第三个参数data表示输入N进制的值;
    第四人参数flat表示data是否为正数。
 */
 void input( int *n, int *m, char *data, bool *flag )
 {
  cout << "Please input n, m and the data for n radix.( n and m both radixes. This program is work for convert data from n radix to m radix. )" << endl << "Please press 'Enter' key when you finish input a value." << endl;
  do
  {
   char num[N] = { 0 };
   cout << "Notice: 2 <= n, m <= 36. The length of data on more than 10000." << endl;
   cout << "n = ";
   cin >> num;
   if( ( strlen( num ) < 1 ) || ( strlen( num ) > 2 ) )
   {
    if( ( num[0] < 48 ) || ( num[0] > 57 ) || ( num[1] < 48 ) || ( num[1] > 57 ) )
    {
     continue;
    }
    continue;
   }
   if( strlen( num ) > 1 )
   {
       *n = ( num[0] - 48 ) * 10 + num[1] - 48;
   }
   else
   {
    *n = num[0] - 48;
   }
  }while( ( *n < 2 ) || ( *n > 36 ) );
  do
  {
   char num[N] = { 0 };
   cout << "Notice: 2 <= n, m <= 36. The length of data on more than 10000." << endl;
   cout << "m = ";
   cin >> num;
   if( ( strlen( num ) < 1 ) || ( strlen( num ) > 2 ) )
   {
    if( ( num[0] < 48 ) || ( num[0] > 57 ) || ( num[1] < 48 ) || ( num[1] > 57 ) )
    {
     continue;
    }
    continue;
   }
   if( strlen( num ) > 1 )
   {
       *m = ( num[0] - 48 ) * 10 + num[1] - 48;
   }
   else
   {
    *m = num[0] - 48;
   }
  }while( ( *m < 2 ) || ( *m > 36 ) );
  do
  {
   bool tag = true;
   int i = 1, t, min = *n < *m ? *n : *m, max = *n > *m ? *n : *m;
   cout << "Notice: 2 <= n, m <= 36. The length of data on more than 10000." << endl;
   cout << "data = ";
   cin >> data;
   if( data[0] == '-' )
   {
    *flag = false;
   }
   while( ( ( data[i] > 47) && ( data[i] < 58 ) ) || ( ( data[i] > 64 ) && ( data[i] < 90 ) ) || ( ( data[i] > 96 ) && ( data[i] < 123 ) ) || ( data[i] == '.' ) )
   {
    if( tag )
    {
     if( data[i] == '.' )
     {
      tag = false;
      if( data[i + 1] == '/0' )
      {
       data[i] = '/0';
       break;
      }
     }
    }
    else
    {
     if( data[i] == '.' )
     {
      break;
     }
    }
    i ++;
   }
   if( data[i] != '/0' )
   {
    cout << "Warning: There are something illegal character in your input. Please input again. Notice: Only '0'-'9', 'A'-'Z', 'a'-'z' and '.' accepted, and then '.' is only allowed to appearance one time.";
    data[0] = '/0';
    continue;
   }
   t = min;
   while( t < max )
   {
    t *= min;
   }
   for( i = 0; data[i] != '/0'; i ++ )
   {
&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值