解题思路:
负数的短除其实和正数的短除是一样的.
区别只在于,负数短除后可能出现余为负的情况,而进制数中数位是不为负的.
解决这个,其实很简单,只要把它变正就好,例子如下.
如果要求-7的-2进制数,那么第一步就要用-7来除以-2,商是3,余数是-1.
那么余数为负,不符题意,我们就试着改变商,试余数变正,实际上只要把商+1即可,
因为余数绝对值恒小于除数的绝对值.
也就是说,现在-7除以-2,商变成了4,余数变成了1,
以此类推,-7的-2进制数就可以推出是 1001 .
对于-13也可这样转换.
总之一句话:保证余数非负!
附上代码o(* ̄︶ ̄*)o
#include<stdio.h> #include<iostream> #include<string> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; int main() { int n; cin >> n; if (n == 0) //如果为0则输出0 cout << "0" << endl; int k = 0; int ans[1001]; while (n != 0) { int num = n % (-2); if (num < 0) //如果小于1则商加1,余数变为1 { num = num-(-2); n = n / (-2) + 1; } else n = n / -2; ans[k++] = num; } for (int i = k-1; i >= 0; i--) cout << ans[i]; return 0; }
另外写了个十进制转-N进制的
#include <iostream> #include <stdio.h> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <set> #include <queue> #include <stack> using namespace std; int ans[1001]; int main() { int num, temp; cin >> num >> temp; int n = num; int k = 0; while (n != 0) { int x = n % temp; n = n / temp; if (x < 0) { x = x - temp; n = n + 1; } ans[k++] = x; } printf("%d=", num); for (int i = k - 1; i >= 0; i--) { if (ans[i] > 9) { char c = ans[i] - 10 + 'A'; cout << c; } else cout << ans[i]; } printf("(base%d)", temp); cout << endl; return 0; }
0.0分
1 人评分
【偶数求和】 (C语言代码)记得sum的归零时机浏览:989 |
2005年春浙江省计算机等级考试二级C 编程题(3) (C语言代码)浏览:417 |
【亲和数】 (C语言代码)浏览:588 |
剪刀石头布 (C语言代码)不知道怎么直接在scanf中用枚举变量浏览:1435 |
WU-格式化数据输出 (C语言代码)浏览:1818 |
WU-整数平均值 (C++代码)浏览:1307 |
Minesweeper (C语言描述,蓝桥杯)浏览:1176 |
字符串输入输出函数 (C语言代码)浏览:2604 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:497 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:420 |