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;
}