题目描述
学习程序设计的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;
}