一道考察模拟乘法的题目

今天hl和我讨论一道题目:

写道
整形数组如a={1,4,5}代表二进制数字1出现的位置(下标从右边开 始,0为第一个),即110010,也即十进制 x=2^1+2^4+2^5=50. 求 3*x=150的二进制表示里边,1的个数。如本题输出4.输入为整形数组如 a。
注意算法性能的优化。

 我感觉这道题目考察的就是模拟乘法,相对于acm常做的大数乘法的模拟算法要简单一些:

int three_x(int a[],int n){
	int bin_len = a[n-1] + 1;
	int res_len = a[n-1] + 3;
	int *bin_a = (int *)malloc( sizeof(int) * bin_len ) ;
	int *res = (int *)malloc( sizeof(int) * res_len );
	memeset(res,0,sizeof(int) * res_len);

	int i,j=0;
	for(i = 0; i <= a[n-1]; i++){//初始化二进制数组
		if(i == a[j]){
                        bin_a[i] = 1;
                        j++
		}else	
			bin_a[i] = 0;
	}
	
	for(int i = 0; i < bin_len; i++){//二进制数组和3做乘法
		res[i] += bin_a[i] * 3 % 2;
		res[i+1] += bin_a[i] / 2; 	     
	} 
	res[res_len-1] += res[res_len-2] / 2;//处理一下高位:
	res[res_len-2] += res[res_len-2] % 2; 

	int num = 0;
	for(i = 0; i < res_len; i++){//求1的个数
		if(res[i] == 1)
			num++;
	}

	return num;
}

 不知道有什么更高级的接法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值