《N诺机试指南》(五)进制转化

进制转化类题目类型:

 

代码详解及注释解答: 

//进制转化问题 
#include <bits/stdc++.h>
using namespace std;

int main(){ 
//	1.反序数 123->321
//	int n;
//	int sn = 0;//存取反序数
//	scanf("%d", &n);
//	while( n!=0 ){
//		sn = sn * 10;
//		sn += (n%10);//求出最后一位,即123的3 
//		n = n/10;//去除最后一位123/10=12 
//	}
//	cout << sn << endl; 

//	2.10进制转x进制代码(x小于10的情况)
//	int n,x;//10进制数和转换进制x
//	scanf("%d %d", &n, &x);
//	int result[105];//存储结果 
//	int count = 0;//result数组下标 
//	while( n!=0 ){
//		int w = n%x;
//		result[count++] = w;
//		n = n/x;
//	}
//	//打印结果,倒序 
//	for(int i=count-1; i>=0; i--){
//		cout << result[i] << " ";
//	} 

//	3.10进制转x进制代码(通用版本)
//	int n,x;//10进制数和转换进制x
//	scanf("%d %d", &n, &x);
//	char result[105];//存储结果(有字符用char型) 
//	int count = 0;//result数组下标 
//	while( n!=0 ){
//		int w = n%x;
//		if( w<10 ){//小于10,例如:数字6-->'6' 
//			result[count++] = w+'0';
//		}else{//大于10,转化成为大写字母 
//			result[count++] = (w-10)+'A';
//		} 
//		n = n/x;
//	}
//	//打印结果,倒序 
//	for(int i=count-1; i>=0; i--){
//		cout << result[i] << " ";
//	}  

//	4.2进制转10进制
//	char s[105];
//	scanf("%s", &s);
//	int sum = 0;
//	for(int i=0; i<strlen(s); i++){
//		if( s[i]=='0' ){
//			sum *= 2;
//		}else{
//			sum = sum*2+1;
//		}
//	}
//	cout << sum << endl;
	
//	5.x进制转10进制(通用)
//	char s[105];//存储要转换的字符串 
//	int x;//进制x 
//	scanf("%s %d", &s, &x);
//	int sum = 0;
//	for(int i=0; i<strlen(s); i++){
//		sum = sum * x;
//		//如果在0-10之内,直接加上该字符转化成的数字 
//		if( (s[i]-'0')>=0 && (s[i]-'0')<=9 ){
//			sum += s[i]-'0';
//		}else{//否则就是A,B,C...这样的,要转化一下 
//			sum += (s[i]-'A') + 10;
//		}
//	}
//	cout << sum << endl;

//	6.x进制转化y进制
//	x进制-->10进制-->y进制 
//	char s[105];//存储要转换的字符串
//	char result[105];
//	int count = 0;//result数组下标 
//	int x, y;
//	scanf("%s %d %d", &s, &x, &y);
//	int sum = 0;
//	//输入的x进制数转化为10进制数 
//	for(int i=0; i<strlen(s); i++){
//		sum = sum * x;
//		int temp = s[i]-'0';
//		if( temp>=0 && temp<=9 ){
//			sum += temp;
//		}else{
//			sum += (s[i]-'A')+10;
//		}
//	}
//	//10进制数转化为y进制,存到result数组 
//	while( sum!=0 ){
//		int k = sum%y;
//		if( k<10 ){
//			result[count++] = k+'0';
//		}else{
//			result[count++] = (k-10)+'A';
//		}
//		sum = sum/y;	
//	}
//	//倒着打印 
//	for(int i=count-1; i>=0; i--){
//		cout << result[i] << " ";
//	}	

//	7.字符串浮点数转浮点数
//	char s[105];//存字符串浮点数
//	int pointIndex = 0;//找到小数点'.'在s中的下标 
//	double sum = 0;//存结果 
//	scanf("%s", &s);
//	int len = strlen(s);
//	//1.找小数点位置 
//	for(int i=0; i<len; i++){
//		if( s[i]=='.' ){
//			break;
//		}
//		pointIndex++;
//	}
//	//2.计算整数部分 
//	for(int i=0; i<pointIndex; i++){
//		sum = sum*10 + (s[i]-'0');	
//	}
//	//3.计算小数部分 
//	int j = 0;
//	for(int i=pointIndex+1; i<len; i++){
//		j--;
//		//pow(x, y)=x的y次方 
//		double temp = pow(10, j);
//		sum += (s[i]-'0')*temp; 
//	}
//	cout << sum << endl;

//	8.浮点数转字符串 
	double n;//浮点数
	char result[105];//存储结果字符串
	int count = 0;
	scanf("%lf", &n);
	//1.先存整数
	int x = (int)n; 
	while( x>0 ){
		result[count++] = x%10 + '0';
		x /= 10;
	}
	//改变存储的整数部分的顺序 
	for(int i=0; i<count; i++){
		result[count-i-1] = result[i];
	}
	//2.存小数点
	result[count++] = '.';
	//3.存小数部分
	double y = n - int(n);//取出小数部分 
	for(int i=0; i<10; i++){//后面的超过10位的小数约等于0,不考虑 
		y = y*10;//例如0.46-->4.6,取出4
		result[count++] = int(y) + '0';//取出4存进去
		y = y - int(y) + 1e-11;//4.6-->0.6 
		//在这里+ 1e-11为了防止精度丢失问题:66.66-->结果:66.659999999 
	}
	//去掉后面的0 
	while(result[--count] == '0');
	result[++count] = '\0';
	//打印 
	printf("%s", result);
	 
	 
	return 0;
} 

第八个 浮点数66.66 转 字符串浮点数“66.66” 这里:需要注意一下

习题推荐:

posted @ 2020-02-16 16:48  Kimishima-Kana  阅读(238)  评论(0编辑  收藏  举报