10进制 VS 2进制 (九度oj)
题目
AC代码#include <stdio.h>#include <string.h>#include <stdlib.h> #define TEN 2000#define TWO 4000 char A[TEN], B[TWO];int C[TEN]; int divideToBinary();void multiplyToDecimal(int k); int main(){ int k; while (scanf("%s", A) != EOF) { k = divideToBinary(); multiplyToDecimal(k); } return 0;} int divideToBinary(){ int i, k, sum, len, d; memset(B, 0, sizeof(B)); sum = 1; len = strlen(A); k = 0; //转换为2进制 while (sum) { sum = 0; for (i = 0; i < len; i ++) { d = (A[i] - '0') / 2; sum += d; if (i == len - 1) { B[k ++] = (A[i] - '0') % 2 + '0'; }else { A[i + 1] += (A[i] - '0') % 2 * 10; } A[i] = d + '0'; } } B[k] = '\0'; return k;} void multiplyToDecimal(int k){ int i, j, c, len; memset(C, 0, sizeof(C)); len = 1; //搞清楚逆序后的关系,没有必要真正的逆序 for (i = 0; i < k; i ++) { for (j = 0; j < len; j ++) { C[j] *= 2; } C[0] += B[i] - '0'; for (j = c = 0; j < len; j ++) { C[j] += c; if (C[j] >= 10) { c = C[j] / 10; C[j] %= 10; }else { c = 0; } } while (c > 0) { C[j ++] = c % 10; c /= 10; } len = j; } for (i = len - 1; i >= 0; i --) { printf("%d", C[i]); } printf("\n");}/************************************************************** Problem: 1208 User: wangzhengyi Language: C Result: Accepted Time:50 ms Memory:924 kb****************************************************************/
后记最近研究大数乘除法比较多,欢迎各位跟帖讨论!