文章目录
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 的 最终 值。