c / c++ 任意进制转换函数

c/c++ 专栏收录该内容
24 篇文章 0 订阅

c/c++进制转换函数实现任意进制数转任意进制数

注意:此函数不依赖任何头文件
2019/08/07增补


多函数实现:(11进制及以上有BUG)
调用aikzp(待转换数字,待转换进制,生成进制)返回生成指定进制数字

int rev(int a,int od) {//颠倒数加强版函数
	int n=a,m=0;
	while(n!=0) {
		m=m*10+n%10+od;
		n/=10;
	}
	return m;
}
int aikzp(int a,int k,int p) {//进制转换 调用:[addb(待转换数字,待转换进制,生成进制)]
	int n=a,m=0,t=1,bt=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m;
		m=0;
	}
	t=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p;
			t++;
		}
		m=rev(m,0);
		t--;
		bt=m;
		while(t>0){
			if(bt<10) m*=10;
			else bt/=10;
			t--;
		}
	} else m=n;
	return m;
}

简单函数实现:(11进制及以上有BUG)
调用jd_aikzp(待转换数字,待转换进制,生成进制)返回生成指定进制数字

int jd_aikzp(int a,int k,int p) {
	int n=a,m=0,t=1,bt=0,dm=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m; 
	}
	t=m=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p,t++;
		}
		while(m!=0) {
			dm=dm*10+m%10;
			m/=10;
		}
		bt=dm,m=0,t--;
		while(t>0) {
			if(bt<10) m*=10,t--;
			else bt/=10,t--;
		}
	} else m=n;
	return m;
}

使用例子:
c:

#include<stdio.h>
int rev(int a,int od) {//颠倒数加强版函数
	int n=a,m=0;
	while(n!=0) {
		m=m*10+n%10+od;
		n/=10;
	}
	return m;
}
int aikzp(int a,int k,int p) {//进制转换 调用:[addb(待转换数字,待转换进制,生成进制)]
	int n=a,m=0,t=1,bt=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m;
		m=0;
	}
	t=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p;
			t++;
		}
		m=rev(m,0);
		t--;
		bt=m;
		while(t>0){
			if(bt<10) m*=10;
			else bt/=10;
			t--;
		}
	} else m=n;
	return m;
}
int jd_aikzp(int a,int k,int p) {
	int n=a,m=0,t=1,bt=0,dm=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m; 
	}
	t=m=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p,t++;
		}
		while(m!=0) {
			dm=dm*10+m%10;
			m/=10;
		}
		bt=dm,m=0,t--;
		while(t>0) {
			if(bt<10) m*=10,t--;
			else bt/=10,t--;
		}
	} else m=n;
	return m;
}
long long jd_aikzp_longlong(long long a,long long k,long long p) {
	long long n=a,m=0,t=1,bt=0,dm=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m; 
	}
	t=m=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p,t++;
		}
		while(m!=0) {
			dm=dm*10+m%10;
			m/=10;
		}
		bt=dm,m=0,t--;
		while(t>0) {
			if(bt<10) m*=10,t--;
			else bt/=10,t--;
		}
	} else m=n;
	return m;
}
int main(){
	long long n,k,p;
	printf("输入数:");
	scanf("%d",&n);
	printf("输入此数进制:");
	scanf("%d",&k);
	printf("输入转换后进制:");
	scanf("%d",&p);
	//aikzp(a,k,p)上面说过了,这里不说了
	//jd_aikzp(a,k,p)上面说过了,这里不说了
	//jd_aikzp_longlong(a,k,p)是long long版本的jd_aikzp函数,防止溢出的问题出现
	printf("jd_aikzp_longlong函数执行结果:%d\n",jd_aikzp_longlong(a,k,p));
	printf("jd_aikzp函数执行结果:%d\n",jd_aikzp(a,k,p));
	printf("aikzp函数执行结果:%d\n",aikzp(a,k,p));
	return 0;
}

c++:

#include <iostream>
using namespace std;
int rev(int a,int od) {//颠倒数加强版函数
	int n=a,m=0;
	while(n!=0) {
		m=m*10+n%10+od;
		n/=10;
	}
	return m;
}
int aikzp(int a,int k,int p) {//进制转换 调用:[addb(待转换数字,待转换进制,生成进制)]
	int n=a,m=0,t=1,bt=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m;
		m=0;
	}
	t=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p;
			t++;
		}
		m=rev(m,0);
		t--;
		bt=m;
		while(t>0){
			if(bt<10) m*=10;
			else bt/=10;
			t--;
		}
	} else m=n;
	return m;
}
int jd_aikzp(int a,int k,int p) {
	int n=a,m=0,t=1,bt=0,dm=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m; 
	}
	t=m=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p,t++;
		}
		while(m!=0) {
			dm=dm*10+m%10;
			m/=10;
		}
		bt=dm,m=0,t--;
		while(t>0) {
			if(bt<10) m*=10,t--;
			else bt/=10,t--;
		}
	} else m=n;
	return m;
}
unsigned long long jd_aikzp_unsignedlonglong(unsigned long long a,unsigned long long k,unsigned long long p) {
	unsigned long long n=a,m=0,t=1,bt=0,dm=0;
	if(k==p) return a;
	if(k!=10) {
		while(n!=0) {
			m+=n%10*t;
			n/=10;
			t*=k;
		}
		n=m; 
	}
	t=m=0;
	if(p!=10) {
		while(n!=0) {
			m=m*10+n%p;
			n/=p,t++;
		}
		while(m!=0) {
			dm=dm*10+m%10;
			m/=10;
		}
		bt=dm,m=0,t--;
		while(t>0) {
			if(bt<10) m*=10,t--;
			else bt/=10,t--;
		}
	} else m=n;
	return m;
}
int main(){
	unsigned long long n,k,p;
	cout<<"输入数:";
	cin>>n;
	cout<<"输入此数进制:";
	cin>>k;
	cout<<"输入转换后进制:";
	cin>>p;
	cout<<"jd_aikzp_unsignedlonglong函数执行结果:"<<jd_aikzp_unsignedlonglong(a,k,p)<<endl;
	cout<<"jd_aikzp函数执行结果:"<<jd_aikzp(a,k,p)<<endl;
	cout<<"aikzp函数执行结果:"<<aikzp(a,k,p)<<endl;
	return 0;
}
  • 3
    点赞
  • 0
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值