前言
唉,總感覺想幫助老師確是力不從心,只能盡自己最大的努力,這一年多下來看還是學生靠譜,學歷高靠譜,學歷不能反應所有問題,但是可以反應大部分問題,至少我身為碩士經常學習算法或者計算機其它方面東西到深夜
題目
[html]
題目描述:
將一個長度最多為30位數字的十進制非負整數轉換為二進制數輸出。
輸入:
多組數據,每行為一個長度不超過30位的十進制非負整數。
(注意是10進制數字的個數可能有30個,而非30bits的整數)
輸出:
每行輸出對應的二進制數。
樣例輸入:
0
1
3
8
樣例輸出:
0
1
11
1000
思路
很明顯,30位的整數是無法用long int類型來表示的,因此我們采用char str[30]的數據結構來存儲這個大整數
字符串表示的大整數轉化為其他進制數步驟 www.2cto.com
通過將除數的每一位加起來判斷是否大於0來作為外層循環的終止條件
內層按位進行除法,存放在一個字符數組中,假設為str2
外層循環結束後,需要逆序str2數組(原理等同於用棧這種數據結構實現進制轉換)
演算紙上推導演算的過程(0:10還在學習代碼的人傷不起):
AC代碼
[cpp]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DATA 40
#define MAX 200
void tenToBin(char *str);
char bin[MAX];
int main()
{
char str[DATA];
while(scanf("%s", str) != EOF)
{
tenToBin(str);
puts(bin);
}
return 0;
}
/**
* Description:字符串整數轉換為二進制
*/
void tenToBin(char *str)
{
int i, j, k, len, sum, d;
char temp;
//初始化參數
sum = 1;
len = strlen(str);
k = 0;
memset(bin, 0, sizeof(bin));
while(sum)
{
sum = 0;
for(i = 0; i < len; i ++)
{
d = (str[i] - '0') / 2;
sum += d;
if(i == len - 1)
{
bin[k ++] = (str[i] - '0') % 2 + '0';
}else
{
str[i + 1] += (str[i] - '0') % 2 * 10;
}
str[i] = d + '0';
}
}
//逆序
for(i = 0, j = k - 1; i < j; i ++, j --)
{
temp = bin[j];
bin[j] = bin[i];
bin[i] = temp;
}
}
/**************************************************************
Problem: 1138
User: wangzhengyi
Language: C
Result: Accepted
Time:90 ms
Memory:908 kb
****************************************************************/