进制转换
2014-11-15 21:44
267 查看
将一个整数转换成二进制形式,考虑负数情况。
这个问题在思维模式上没有什么难得,只是要在编程中注意到一些细节,注意+0和-0的情况。大致思想是:#1.求出对应绝对值的原码
#2.除最高位,按位取反
#3.位低位加1
/************************************************************************* > File Name: b.c > Author: 傻李 > Mail: hellojukay@gmail.com > Created Time: 2014年11月15日 星期六 20时01分35秒 ************************************************************************/ #include<string.h> #include<stdio.h> #include<math.h> int result[sizeof(int) * 8]; void translate(int a) { int c,i; int tmp;//保存目标的绝对值 tmp = abs(a); memset(result,0,sizeof(int) * 8); if(a == 0) { for(i = 0; i < sizeof(int) * 8; ++i) result[i] = 0; return ; } for(i = 0; i < sizeof(int) * 8 - 1; ++i) { result[i] = tmp % 2; tmp = tmp / 2; } //默认符号位0 result[i] = 0; //负数求补码过程 if(a < 0) { result[sizeof(int) * 8 - 1] = 1; for(i =0 ; i < sizeof(int) * 8 - 1;++i) { //除最高最位,按位取反 switch(result[i]) { case 1: result[i] = 0; break; case 0: result[i] = 1; break; } } //尾数加1 c = 1; for(i = 0; i < sizeof(int) && c != 0; ++i) { tmp = result[i];//此处tmp保存临时值 result[i] = result[i] ^ c; c = tmp & c; } } } int main() { int a; scanf("%d",&a); translate(a); int i; for(i = sizeof(int)*8 -1; i >= 0; --i) { printf("%d",result[i]); } return 0; }11月16日更
本来像写大数乘法的,想来想去,觉得很便起来会很繁琐,有很多细节要处理,于是有用c++把大数加法由实现了一遍,原理还是一样的,只是没有数组产度的限制了。
/************************************************************************* > File Name: big_mult.cpp > Author: 傻李 > Mail: hellojukay@gmail.com > Created Time: 2014年11月16日 星期日 20时54分52秒 ************************************************************************/ #include<iostream> #include<string> #include<vector> using namespace std; vector<int> big_add(string str1,string str2) { int len1,len2; //进位 int c = 0; int sum; len1 = str1.size() > str2.size() ? str1.size():str2.size(); len2 = str1.size() < str2.size() ? str1.size():str2.size(); vector<int> a,b; vector<int> result;//保存计算结果 //保证a中保存的是那个大的数字 if(str1.size() > str2.size()) { for(auto s : str1) { a.push_back(s-'0'); } for(auto s : str2) { b.push_back(s -'0'); } } else { for(auto s : str2) { a.push_back(s-'0'); } for(auto s : str1) { b.push_back(s-'0'); } } for(int i = 1 ; i <= len1; ++i ) { for(; i <= len2; ++i) { sum = a[len1 - i] + b[len2 - i] + c; result.push_back(sum%10); c = sum / 10; } sum = a[len1 -i] +c; result.push_back(sum%10); c = sum / 10; } return result; } int main() { string str1,str2; vector<int> result; cin >> str1; cin.clear(); cin >> str2; result = big_add(str1,str2); for(int i = result.size()-1; i >= 0; --i) cout << result[i]; return 0; }
相关文章推荐
- codevs 进制转换 模拟
- 进制转换问题
- [Erlang]整数与浮点数转换、进制转换
- 使用栈实现进制转换
- 进制转换
- 02_java关键字、表识符、注释、进制转换、补码反码、数据类型转换
- 进制转换课后练习
- 【暑期基础2】Z HDU 2051 Bitset (进制转换)
- 用栈实现进制转换
- HDU 2031 进制转换(进制转换)
- HDU2031 进制转换
- 九度OJ 1026:又一版 A+B (进制转换)
- 九度OJ 1208:10进制 VS 2进制 (进制转换)
- 数据结构实验之栈一:进制转换
- cf 602 A(进制转换)
- 进制转换
- C语言习题5.18--进制转换
- C# 进制转换 进制互转
- 九度oj 进制转换 1026,1118,1138,1194
- 进制转换