1. 程式人生 > >中石油新生賽第四場 問題D 17倍

中石油新生賽第四場 問題D 17倍

題目描述

學習程式設計的Lanlan記得老師給她佈置的第一個任務是:輸入一個數N,然後輸出17*N的值。當然這個任務非常簡單,經過一段時間的學習,蘭蘭有了一些的進步,老師又佈置了一個類似的任務,只是變更了一個條件,輸入的N是一個二進位制數,輸出的值也要是二進位制表示的。
現在請幫助Lanlan完成這個任務。

輸入

一個二進位制表示的數N。

輸出

二進位制表示的17*N。

樣例輸入
10110111
樣例輸出
110000100111

提示
10110111相當於十進位制的183,於是183*17=3111,二進位制形式是110000100111。
30%的資料N的位數小於25位
50%的資料N的位數小於50位
100%的資料N的位數小於1000位

由於剛用進位制轉換函式做出了第三場的進位制轉換題,一拿到這個題可把我樂壞了,直接2進位制轉10進位制,乘上17,再轉回去,一執行,結果對,提交,錯。。。
後來一想這個二進位制小於1000位,意味著如果轉回十進位制的時候可能會算到2的幾百次方。。。那太誇張了,long long int也成弟弟。。。
正確的思路應該是先把二進位制的每一位都乘以17,然後再進位。

#include <stdio.h>
#include <string.h>
int main()
{
	char n2[1000];
	int len,temp,index;
	int a[1000];
	scanf("%s"
,n2); len=strlen(n2); for(int i=0;i<len;i++) a[i]=(n2[i]-'0')*17; for(int i=len-1;i>0;i--) { a[i-1]=a[i-1]+a[i]/2; a[i]=a[i]%2; } temp=a[0]; //原來的二進位制數進到a[0]後不能再往前進了,接著要把a[0]轉化成二進位制數 index=len; while(temp>0) { a[index++]=temp%2; temp/=2; } for(int i=index-1;i>=len;i--) //輸出時a[0]轉化成的二進位制數,注意要倒著輸出,因為轉化時是從後往前
printf("%d",a[i]); for(int i=1;i<len;i++) //再把除a[0]外原來的進完位的二進位制位數逐一輸出 printf("%d",a[i]); return 0; }