C语言基础练习题21-30

21、有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排
序。

#include<stdio.h>
#define MAX 1000
int main()
{
	int nums[MAX],i=0,newnums[MAX],m;
	while(1&&i<MAX){
		scanf("%d",&m);
		nums[i]=m;
		i+=1;
        char c = getchar();
        if (c == '\n') {
            break;
        }
	}

	for(int j=0;j<i;j++){

		newnums[j]=nums[j]*nums[j];
	}
	for(int k=0;k<i;k++){
		for(int t=k;t<i;t++){
			if(newnums[k]>newnums[t]){
				m=newnums[k];
				newnums[k]=newnums[t];
				newnums[t]=m;
			}
		}
	}
	for(int k=0;k<i;k++){
		printf("%d ",newnums[k]);
	} 
	return 0;
}

在这里插入图片描述

22、三角形的最大周长

给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。
如果不能形成任何面积不为零的三角形,返回 0。
思路:先将数组进行排序,方便找到最大周长的边。三角形满足两边之和大于第三边,当确定a>b>c时,只要b+c>a即可,此时取相邻三条边时周长是最大的。

#include<stdio.h>
#define MAX 1000
int main()
{
	int a,b,c,nums[MAX],i=0,newnums[MAX],m;
	while(1&&i<MAX){
		scanf("%d",&m);
		nums[i]=m;
		i+=1;
        char c = getchar();
        if (c == '\n') {
            break;
        }
	}

	for(int k=0;k<i;k++){
		for(int t=k;t<i;t++){
			if(nums[k]<nums[t]){
				m=nums[k];
				nums[k]=nums[t];
				nums[t]=m;
			}
		}
	}
	for(int j=0;j<i-2;j++){
		if(nums[j]<nums[j+1]+nums[j+2]){
			printf("%d",nums[j]+nums[j+1]+nums[j+2]);
			return 0;
		}
	}
	printf("0");
	return 0;
}

在这里插入图片描述在这里插入图片描述

23、找出 3 位偶数

给你一个整数列表 digits ,只有 3 个值,其中每个元素都是一个数字(0 - 9),列表中的成员可能重复,例如[4,5,5]。
你需要找出 所有 满足下述条件且 互不相同 的整数:
1.该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
2.该整数不含 前导零(也就是不能由 0 开头)
3.该整数是一个 偶数
例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。
将找出的所有互不相同的整数按 递增顺序 排列,并以列表形式返回。

思路:(稍显复杂)
先把不由0开头的组合成的所有数找出来(条件2),把偶数的放进数组里(条件3),对数组进行排序后输出(条件1).

#include<stdio.h>
#define MAX 1000
int main()
{
	int digits[3],nums[6],n;//nums存放满足条件的结果,3个数任意排列有6种可能 ,n为满足条件的结果个数 
	while(1){
		scanf("%d %d %d",&digits[0],&digits[1],&digits[2]);
		for(int i=0;i<3;i++){
			if(digits[i]<0||digits[i]>9){
				printf("请输入0-9之间的数字!");
				break; 
			}
		}
		n=0; 
		for(int j=0;j<3&&digits[j]!=0;j++){//不以0开头 
			for(int k=0;k<3;k++){
				for(int t=0;t<3;t++){
					if(j!=k&&j!=t&&k!=t){
						int temp=digits[j]*100+digits[k]*10+digits[t];
						if(temp%2==0){//把偶数的放进数组
							nums[n++]=temp;
						}
						
					} 
					
				}
			}
		} 
		//排序
		for(int i=0;i<n;i++){
			for(int j=i;j<n;j++){
				if(nums[i]>nums[j]){
					int temp=nums[i];
					nums[i]=nums[j];
					nums[j]=temp;
				}
			}
		} 
		//输出
		for(int i=0;i<n;i++){
			printf("%d  ",nums[i]);
		}
	}
	 
	return 0;
}

在这里插入图片描述

24、进制转换

给出 n和 r,把n这个数字转换成 r进制的数。其中: 1<=n<=100000, 2< =r<=9
思路:十进制转r进制,采用除r取余法

#include<stdio.h>
int main()
{
	int n,r,a,b,m=0,i=1;
	printf("请输入十进制数n:");
	scanf("%d",&n);
	printf("请输入要转换的进制r:"); 
	scanf("%d",&r);
	while(n!=0){
		a=n%r;
		n=n/r;
		m=m+a*i;
		i*=10;
	}
	printf("%d",m);
	return 0;
}

在这里插入图片描述

25、各位相加

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
思路:这几道题都是要得到一个数各个位上的值,只要要整除+取余两步就可以实现。

#include<stdio.h>
int main()
{
	int num,a,m=0;
	printf("请输入非负整数num:");
	scanf("%d",&num);
	while(num!=0){
		a=num%10;
		num=num/10;
		m=m+a;
	}
	printf("%d",m);
	return 0;
}

在这里插入图片描述

25、约瑟夫问题

有 n 只猴子,按顺时针方向围成一圈选大王(编号从 1 到 n),从 1 号开始报数,一直数到 k,数到 k 的猴子退出圈外,剩下的猴子再接着从 1 开
始报数,就这样,直到圈内只剩下一只猴子时,它就是猴王。编程输入 n 和 k,输出最后猴王的编号。
思路:这里采用数组存放编号,n个编号,每个编号刚好是数组下标。用a来记录当前的编号,a>n时,利用a=a%num实现一圈结束的效果。循环遍历,用j记录数数,数到k时,则当前编号置为-1,表示退出圈外。因此在每次数数前还要判断是否为-1,不为-1才可以参与数数。用m记录当前圈内剩下人数,m=1时结束循环。此时,数组中唯一一个不为-1的编号就是猴王的编号。

#include<stdio.h>
int main()
{
	int num,k,list[1000],a,m;
	scanf("%d %d",&num,&k);
	for(int i =1;i<=num;i++){
		list[i]=i;
	}
	a=1;
	m=num;
	while(m!=1){// 
		int j=0;
		while(j!=k){//每次报数k个数 
			if(a>num){
				a=a%num;//新的一轮 
			} 
			if(list[a]!=-1){ 
				j+=1;//报数+1 
			}
			a++;//编号+1 
		}
		//第7个人的值置为-1
		list[--a]=-1;
		m--;//剩下人数-1 
		a++; 
	}
	//值不为-1的就是剩下的 
	for(int i=1;i<=num;i++){
		if(list[i]!=-1){
			printf("%d",i);
		}
	} 
	
	return 0;
}

26、二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
提示:先二进制转十进制,求和后再十进制转二进制
自己写的,二进制转十进制不知道哪里出错了,转换出来的结果是错误的,暂时想不出来,下次再来看

#include<stdio.h>
#include<String.h> 
//二进制转十进制 
int btoi(char s[100],int n){
	int num=0,tag=1;
	for(int i=n-1;i>=0;i--){
		num+=int(s[i])*tag;
		tag*=2;
	}

	return num;
}
//十进制转二进制
int itob(int n){
	int i=1,bn=0;//二进制位数
	while(n!=0){
		bn+=n%2*i;
		n/=2;
		i*=10;
	} 
	
	return bn;
} 
int main()
{
	char s1[100],s2[100];
	int n1,n2,n;
	scanf("%s",&s1);
	scanf("%s",&s2);
//	printf("%s",s1);
	n1=strlen(s1);
	n2=strlen(s2);
	printf("%d\n",btoi(s1,n1));
	printf("%d\n",btoi(s2,n2));
	n=btoi(s1,n1)+btoi(s2,n2);//得到相加后的十进制值 
	printf("%d\n",n);
	printf("%d\n",itob(n));
	return 0;
}

27、换饮料问题

小区便利店正在促销,用 numExchange 个空饮料瓶可以兑换一瓶新饮料。你购入了 numBottles 瓶饮料。如果喝掉了瓶中的饮料,那么饮料瓶就
会变成空的。请你计算最多能喝到多少瓶饮料
在这里插入图片描述
分析:最后手头上瓶子数<3时,不能继续兑换。

#include<stdio.h>

int main()
{
	int nb,ne,a,b,num;
	scanf("%d %d",&nb,&ne);
	num=nb;//一开始买的就有nb瓶 
	while(nb>=3){
		a=nb%ne;//剩下a个空瓶 
		b=nb/ne;//能换b瓶新饮料
		num+=b; 
		nb=a+b;//现在有a+b个瓶子 
	}
	printf("最多能喝到%d瓶饮料",num);
	
	return 0;
}

在这里插入图片描述

28、攒钱

小 T 打算攒钱,每天都会往储蓄罐里存入一些硬币。具体的说,他会在第一天放入 1 枚硬币,第二天放入 2 枚硬币,第三天放入 3 枚硬币,以此
类推,他想知道第几天可以存满 m 枚硬币。
输入格式:输入整数 m
输出格式:输出天数
思路:很简单的,累加就对了

#include<stdio.h>
int main()
{
	int m,day=0,num=0;
	scanf("%d",&m);
	while(num<m){
		day++;
		num+=day;
	}
	printf("第%d天可以存满%d枚硬币",day,m);
	
	return 0;
}

在这里插入图片描述

29、比赛中的配对次数

给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:
如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。
如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进
入下一轮。
返回在比赛中进行的配对次数,直到决出获胜队伍为止。

#include<stdio.h>

int main()
{
	int n,num=0;
	scanf("%d",&n);
	while(n>1){
		if(n%2==0){
			num+=n/2;
			n=n/2;
		}
		else{
			num+=(n-1)/2;
			n=(n-1)/2+1;
		}
	}
	printf("%d",num);
	
	return 0;
}

在这里插入图片描述

30、将找到的值乘以 2

给你一个整数数组 nums ,另给你一个整数 x ,这是需要在 nums 中搜索的第一个数字。
接下来,你需要按下述步骤操作:如果在 nums 中找到 x ,将 x 乘以 2 ,得到新 x(即,令 x = 2 * x)。否则,停止这一过程。只要能在数组中
找到新 x ,就对新 x 继续 重复 这一过程。返回 x 的 最终 值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值