中石油新生赛第四场 问题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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值