zzuli(1141-1150)

文章详细介绍了进制转换(如1141进制转换)、二进制数的大小比较、多种进制表示及转换、数组操作(查找子数组、组合三位数)以及整数处理(有问题的里程表、吃糖果、计数整数)。展示了C语言中的基本算法和数值处理方法。
摘要由CSDN通过智能技术生成

目录

1141进制转换

1142二进制数的大小

1143最大值—多种进制

1144多种进制

1145有问题的里程表

1146吃糖果

1147查找子数组

1148组合三位数之一

1149组合三位数之二

1150数数多少个整数


1141进制转换

#include<stdio.h>
#include<string.h>
#define N 10050
void convert(int n,char str[]){
	int i=0,j;
	if(n==0){ //考虑0的情况 
		printf("0\n");
	}
	while(n>0){
		str[i]=n%2+'0';//转化成字符型 
		n=n/2;
		i++;
	}
	for(j=i-1;j>=0;j--){
		printf("%c",str[j]);
	}

} 

int main(){
	int i,j,n;
	char str[N];
	scanf("%d",&n);//非负整数 
	convert(n,str);
	return 0;
}


1142二进制数的大小

三数排序的方法

其中 sum=sum+(str[i]-'0')*pow(2.0,j++);

(str[i]-'0') 将字符型转换为整型,1141题类似,但相反

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 31
int bToD(char str[]){//函数返回二进制数str对应十进制整数
	int i,j=0,len,sum=0;
	len=strlen(str);
	for(i=len-1;i>=0;i--){
		sum=sum+(str[i]-'0')*pow(2.0,j++);
	} 
	return sum;
} 

int main(){
	int i,j,t,a=0,b=0,c=0;
	char str1[N],str2[N],str3[N];
	scanf("%s %s %s",str1,str2,str3);
	a=bToD(str1);
	b=bToD(str2);
	c=bToD(str3);
	if(a>b){t=a;a=b;b=t;}//经典三数排序
	if(b>c){t=b;b=c;c=t;}
	if(a>b){t=a;a=b;b=t;}
	printf("%d %d %d", a,b,c);
	return 0;
}


1143最大值—多种进制

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 31
int KToD(char str[],int k){//函数返回二进制数str对应十进制整数
	int i,j=0,len,sum=0;
	len=strlen(str);
	for(i=len-1;i>=0;i--){
		sum=sum+(str[i]-'0')*pow(k,j++);
	} 
	return sum;
} 

int main(){
	int i=0,j,t;
	int n;
	scanf("%d",&n);
	getchar();
	int a[n];
	while(n--){
		char str[1000];
		int k;
		scanf("%s %d",str,&k);
		a[i]=KToD(str,k);
		i++;
	}
	
	int max=a[0];//第一个先赋给max
	for(j=0;j<i;j++){//求最大值 
		if(max<a[j]){
			int t=max;
			max=a[j];
			a[j]=t;
		}
	} 
	printf("%d",max);
	return 0; 

}


1144多种进制

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 31

void dToK(int n,int k,char str[]){//将n转化为k进制数,存入str
	int i=0,j;
	if(n==0){
		str[0]=0;
	}
	while(n>0){
		str[i]=n%k+'0';
		n=n/k;
		i++;
	}
	for(j=i-1;j>=0;j--){
		printf("%c",str[j]);
	}
	printf("\n");
}
int main(){
	int i=0,j,n;
	char str[N];
	scanf("%d",&n);
	getchar();
	dToK(n,2,str); 
	dToK(n,3,str); 
	dToK(n,7,str); 
	dToK(n,8,str); 
	
	return 0; 
}


1145有问题的里程表

#include <stdio.h>
int main(){
	int num,sum=0;
	int i=0,j,k,m;
	int a[10];
	
	scanf("%d",&num);
	while(num>0){//判断数一共有几位 ,每一位都存储在a[i]中 
		a[i]=num%10;
		num=num/10;
		i++;
	}
	for(j=0;j<i;j++){
		m=1;
		for(k=1;k<=j;k++){//每十个数少一,也就是9 
			m=m*9;
		}
		if(a[j]<=3){
			sum=sum+a[j]*m;
		}if(a[j]>=5){
			sum=sum+(a[j]-1)*m;
		}
	} 
	printf("%d\n",sum);
	return 0;
}

1146吃糖果

#include<stdio.h>
#include<limits.h>
int main()
{
    int a,b,c,max,sum;
    scanf("%d",&a);
    while(a--)
    {
        max=INT_MIN,sum=0;
        scanf("%d",&b);
        while(b--)
        {
	        scanf("%d",&c);
	        if(c>max)//找出数量最多的一种糖果;
	            max=c;
	        sum+=c;//计算所有糖果的数量总和;
        }
        sum=sum-max;//计算出除去数量最多的糖果后的数量总和;
        
		if(sum>=(max-1))//判断剩余糖果能否隔开全部数量最多的糖果;
            printf("Yes\n");//一旦数量最多的糖果能被全部隔开,即同种糖果不相邻;
        else
            printf("No\n");
    }
    return 0;
}


1147查找子数组

#include<stdio.h>

int main()
{
    int m,n,i,j,x,a[100],b[100];
	scanf("%d%d",&n,&m);//输入 
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<m;i++)
		scanf("%d",&b[i]);
		
    for(i=0;i<n;i++){//先判断b的第一位和a的哪一位相等 
    	if(a[i]==b[0]){
    		x=i;
    		for(j=0;j<m;j++){
    			if(a[i+j]!=b[j]){//依次看后边几个相等 
    				break;
				}
			}
			if(j==m){
				break;
			}
		}
	}

	if(j==m){
		printf("%d",x);
	}else{
		printf("No Answer");
	}
    
    return 0;
}


1148组合三位数之一

#include<stdio.h>
#include<math.h> 
int PanDuan(int a,int b,int c);   //判断组成三个数的数字是否存在重复 
int main()
{
	int i,j,k,x,n,num[20],t=0;
	for(i=1;i<=9;i++)
		for(j=1;j<=9;j++)
			for(k=1;k<=9;k++)
			{
				if(i==j||i==k||j==k)   //不允许数字重复使用
					continue;      //重复了就结束本次循环
					
				n=i*100+j*10+k;   //组成的三位数 
				x=sqrt(n);
				
				if(x*x==n)   //为真说明这个三位数是完全平方数,将其存入数组 
					num[t++]=n; 
			}
	//遍历数组,找出不重复的一组完全平方数
	for(i=0;i<t;i++)
		for(j=i;j<t;j++)
			for(k=j;k<t;k++)
			{
				if(PanDuan(num[i],num[j],num[k]))   //如果三个数由不重复的数字组成,输出
					printf("%d %d %d\n",num[i],num[j],num[k]);	
			} 
	return 0;
}

int PanDuan(int a,int b,int c)
{
	int i,digit[10]={0};
	while(a)
	{
		i=a%10;   //x代表其最后一位
		digit[i]++;	
		a/=10;
	}
	while(b)
	{
		i=b%10;
		digit[i]++;
		b/=10;
	}
	while(c)
	{
		i=c%10;
		digit[i]++;
		c/=10;
	}
	
	for(i=1;i<=9;i++)
	{
		if(digit[i]!=1)  //不是1说明存在重复的数字
			return 0; 
	}
	return 1;
}

1149组合三位数之二

刚开始使用循环将所有组成的三位数存到数组中在使用循环找到符合要求的一组数据,但这样会循环超时,因此考虑到最大的第三数是第一个数的3倍,三个数又都是三位数,最大不超过999,因此,第一个数最大为333,最小为100.

#include<stdio.h>
#include<math.h> 
int PanDuan(int a,int b,int c);   //判断组成三个数的数字是否重复
int main()
{
	int a,b,c;
	for(a=100;a<=333;a++) 
	{
		b=a*2;
		c=a*3;
		if(PanDuan(a,b,c))
			printf("%d %d %d\n",a,b,c);	
	}
	return 0;
}
int PanDuan(int a,int b,int c)
{
	int i,digit[10]={0};
	while(a)
	{
		i=a%10;   //x代表其最后一位
		digit[i]++;	
		a/=10;
	}
	while(b)
	{
		i=b%10;
		digit[i]++;
		b/=10;
	}
	while(c)
	{
		i=c%10;
		digit[i]++;
		c/=10;
	}
	
	for(i=1;i<=9;i++)
	{
		if(digit[i]!=1)  //不是1说明存在重复的数字,返回0 
			return 0; 
	}
	return 1;  //数字不重复则符合要求
}

1150数数多少个整数

/*
1、输入字符串
2、使用int isdigit() 若该位置为数字则返回1,否则为0 
3、循环遍历字符串 当判断为数字,且flag=0 , 
				一种正常数字123 正常++ flag=1,防止后续数字再次计数 
				另一种010  加一,将 flag=0,将后续数字进行计数 
*/
#include<stdio.h>
#include<ctype.h>
int main()
{
	char str[1000];
	int i,sum,flag;
	sum=0;flag=0;
	gets(str);  //输入字符串
	
	for(i=0;str[i]!='\0';i++)
	{
		if(isdigit(str[i])&&flag==0)   
		{
			if(str[i]=='0'&&isdigit(str[i+1]))  //形如010、00124Z这种
			{
				sum++;
				flag=0;
				continue;	
			}	
			sum++;    //这一部步说明str[i]!='0',而是形如1234这种 
			flag=1;   //设为1,防止例如123这种1后面的数字被重复计算 
		}	
		if(!isdigit(str[i]))
			flag=0; 
	}	
	printf("%d\n",sum);
} 

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一道经典的位运算题目,考察对二进制的理解和位运算的熟练程度。 题目描述: 给定一个长度为 $n$ 的数组 $a$,初始时每个数的值都为 $0$。现在有 $m$ 个操作,每个操作为一次询问或修改。 对于询问,给出两个整数 $l,r$,求 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 的值。 对于修改,给出一个整数 $x$,表示将 $a_x$ 的值加 $1$。 输入格式: 第一行两个整数 $n,m$。 接下来 $m$ 行,每行描述一次操作,格式如下: 1 l r:表示询问区间 $[l,r]$ 的异或和。 2 x:表示将 $a_x$ 的值加 $1$。 输出格式: 对于每个询问操作,输出一个整数表示答案,每个答案占一行。 数据范围: $1 \leq n,m \leq 10^5$,$0 \leq a_i \leq 2^{30}$,$1 \leq l \leq r \leq n$,$1 \leq x \leq n$ 输入样例: 5 5 2 1 2 3 1 2 4 2 2 1 1 5 输出样例: 0 2 解题思路: 对于询问操作,可以利用异或的性质,即 $a \oplus b \oplus a = b$,将 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 转化为 $(a_1 \oplus \cdots \oplus a_{l-1}) \oplus (a_1 \oplus \cdots \oplus a_r)$,因为两个前缀异或后的结果可以相互抵消,最后的结果即为 $a_1 \oplus \cdots \oplus a_{l-1} \oplus a_1 \oplus \cdots \oplus a_r = a_l \oplus \cdots \oplus a_r$。 对于修改操作,可以将 $a_x$ 对应的二进制数的每一位都分离出来,然后对应位置进行修改即可。由于只有加 $1$ 操作,所以只需将最后一位加 $1$ 即可,其余位不变。 参考代码:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值