中石油新生賽第四場 問題D 17倍
阿新 • • 發佈:2018-12-20
題目描述
學習程式設計的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;
}