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位数来运算会增加运行时间。