JZ15 二进制中1的个数
利用 n = n & (n - 1)消1 然后count++或者 n&1==1(说明此时二进制最后一位为1) 然后n=n>>1;
#include<stdio.h>
// int NumberOf1(int n){
// int flag=32;//32位
// int count=0;
// while(flag){
// if(n&1==1){
// count++;
// }
// n=n>>1;
// flag--;
// }
// return count;
// }
int NumberOf1(int n) {
int count = 0;
while (n) {
n = n & (n - 1);
count++;
}
return count;
}
int main(){
int ww=0;
scanf("%d",&ww);
int count= NumberOf1(ww);
printf("%d\n",count);
return 0;
}
OR76 两个整数二进制位不同个数
#include<stdio.h>
//直接判断
int diff(int ww,int cc){
int count=0;
int i=0;
for(i=0;i<32;i++){
if(((ww>>i)&1)!=((cc>>i)&1)){
count++;
}
}
return count;
}
异或^ 相同为0 为异为1
//int diff(int ww,int cc){
// int count=0;
// int n=ww^cc;
// //求有多少个1
// while(n){
// n=n&(n-1);
// count++;
// }
// return count;
//}
//求两个数二进制不同的位数有几个
int main(){
int ww=0;
int cc=0;
scanf("%d %d",&ww,&cc);
int count= diff(ww,cc);
printf("%d\n",count);
return 0;
}
易错点
全局变量 静态变量都在放在静态区 不初始化 默认为0
局部变量 是放在栈区 不初始化 默认值是随机值sizeof这个操作符计算返回值结果是size_t类型的 是无符号整形
//i为-1 比较的过程中会变成一个非常大的正数
//最终i>sizeof(i) 4
#include<stdio.h>
//全局变量 静态变量都在放在静态区 不初始化 默认为0
//局部变量是放在栈区 不初始化 默认值是随机值
int i;//全局变量 默认为0
int main(){
i--; //-1
//sizeof这个操作符计算返回值结果是size_t类型的 是无符号整形
//i为-1 比较的过程中会变成一个非常大的正数
//最终i>sizeof(i) 4
if(i>sizeof(i)){
printf(">\n");
} else{
printf("<\n");
}
return 0;
}
X形图案(找规律)
对角线
* *
* *
*
* *
* * i=j时 或者i+j=长度时打印if((i==j)||(i+j==n-1))
#include<stdio.h>
int main(){
int n=0;
//多组输入
while(scanf("%d",&n)==1){
int i=0;
for(i=0;i<n;i++){
int j=0;
for(j=0;j<n;j++){
if(j==i||j==n-i-1){
printf("*");
} else
printf(" ");
}
printf("\n");
}
}
return 0;
}
BC74 获得月份天数
此题代码很简单 需注意的是while判断中
scanf("%d %d", &year, &month) != EOF或者
scanf("%d %d",&year,&month)==2
scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。
#include<stdio.h>
int main(){
int year=0;
int month=0;
while(scanf("%d %d",&year,&month)!=EOF){
if(month==1||
month==3||
month==5||
month==7||
month==8||
month==10||
month==12){
printf("%d\n",31);
}else if(month==2){
if((year%4==0&&year%100!=0)||year%400==0){
printf("%d\n",29);
}else{
printf("%d\n",28);
}
}else{
printf("%d\n",30);
}
}
return 0;
}
BC71 三角形判断
先判断大小
#include<stdio.h>
int main(){
int a=0;
int b=0;
int c=0;
while(scanf("%d %d %d",&a,&b,&c)==3){
int arr[3]={a,b,c};
int i=0;
for(i=0;i<3-1;i++){
int j=0;
for(j=0;j<3-1-i;j++){
if(arr[j]<arr[j+1]){
int temp=0;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
if(arr[0]<arr[1]+arr[2]){
if(arr[0]==arr[2])
printf("Equilateral triangle!\n");
else if(arr[0]==arr[1]||arr[1]==arr[2])
printf("Isosceles triangle!\n");
else
printf("Ordinary triangle!\n");
}else{
printf("Not a triangle!\n");
}
}
return 0;
}
直接if判断
#include<stdio.h>
int main(){
int a=0;
int b=0;
int c=0;
while(scanf("%d %d %d",&a,&b,&c)==3){
//任意两边大于第三边
if(a+b>c&&a+c>b&&b+c>a){
if(a==b&&b==c){
printf("Equilateral triangle!\n");
} else if(a==b||b==c||a==c){
printf("Isosceles triangle!\n");
}else{
printf("Ordinary triangle!\n");
}
} else{
printf("Not a triangle!\n");
}
}
return 0;
}