2-ACM-作业3~5

2019.11.19

1101

1.输入一段含空格的字符串,以回车结束,就应该用gets(),结合数组。

1189

#define p 1e-6 没有分号!
浮点数判断a==b要用fabs(a-b)<eps的方式,fabs是绝对值函数。
为什么不能用%g,要用%.0f呢?
我想的应该是会有精度误差。

1059

//思路:用unsigned int 可直接将负数也表示成补码的十进制。

1102

思路://用个异或就写出来了,再看有多少个1即可。

#include<stdio.h>
int main(){
	int n,x,y,z,i,ans; 
	scanf("%d",&n);
	while(n--){
		ans=0;
		scanf("%d%d",&x,&y);
		z=x^y;
		for(i=1;i<=32;i++){
			if(z&1){      //位运算。 
				ans++;
			}
			z>>=1;
		}
		printf("%d\n",ans);
	}
	return 0;	
} 

按位与 &
按位或 |
按位异或 ^
取反 ~
<< 左移 用来将一个数的各二进制位 全部左移n位,右补0.

右移 用来将一个数的各二进制位右移n位,移到右端的
地位被舍弃,对于无符号数,高位补0。

1117

法1:用一个二维数组的前缀和。(小题大用)
法二:用一个数组将1~max的数码平方和的个位数都存下来,数组下标就对应n,再扫一遍这个数组来找即可。(优解)。

/*思路:前缀和*/ 
#include<stdio.h>
#define max 100000
int w[11][max+11];//只是max会越界。数组定义时一定要开大一点,出现很大的数多半越界 。 
int main()
{
	int i,j,a,b,n,k,sum,p;
	for(i=1;i<=max;i++){
		j=i;sum=0;
		while(j){
			sum+=j%10*j%10;
			j/=10;
		}
		for(j=0;j<=9;j++){
			if(sum%10==j)  w[j][i]=w[j][i-1]+1;
			else  w[j][i]=w[j][i-1];
		}
	}
	scanf("%d",&k);
	while(k--){
		scanf("%d%d%d",&a,&b,&n);
		printf("%d\n",w[n][b]-w[n][a-1]);
	}
	return 0;
}

注意:;定义数组长度时,只是max会越界。数组定义时一定要开大一点,出现很大的数多半越界 。

#1221

/*思路:把n依次去掉二进制最低位(用位运算),直到为0,
如果为1,p++,否则,判断p是否最大,并使p归0。*/ 
#include<stdio.h>
int main(){
	unsigned int n;
	int k,i,max,p;
	scanf("%d",&k);
	while(k--){
		scanf("%d",&n);
		max=0;p=0;
		while(n){
			if(n&1){
				p++;	
			}  
			else{
				if(p>max)  max=p;
				p=0;
			}
			n>>=1;
		}
		if(p>max)  max=p;
		printf("%d\n",max);
	}
	return 0;
} 

1251

long long 的输入输出,用%I64d.
用64位数来运算会增加运行时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marhoosh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值