喝汽水问题, 1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少瓶汽水

1.喝汽水问题, 1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少瓶汽水

思路:

首先进行如图所示的第一列操作,当为0个瓶子时,开始第二列的计算(用空瓶子数来换汽水)重复上面的操作,直到只有一个空瓶时返回0。


int A(int n, int y)
{
	if(n==0)//汽水喝完,开始用空瓶子来换汽水
	{
		if(y <= 1)
		{
			return 0;
		}
		else
		{
			//计算多余出来瓶子的个数
			int i = 0;
			int j = 0;
			while(y)//计算喝完之前多出来多少个空瓶
			{
				if(y%2 != 0)
					i++;
				y = y/2; 
			}
			j = i;
			i= i/2;
			return i+A(i/2, j);
		}
	}
	else
	{
	    return n+A(n/2,y);
    }

    
}


int main()
{
	int x = 0;
	int y = 0;
	scanf("%d", &x);
	y = A(x, x);
	printf("%d", y);
	system("pause");
	return 0;
}
2.在一个数组中只有两个数数字出现一次,其他的都出现两次,找出这两个数
#include<stdio.h>
#include<stdlib.h>

void Find(int arr[],int c[],int n)
{
        int i = 0;
	int j = 0;
	int b[10] = {0};//用来记录数组a中数组是否成对存在
	for(i = 0; i < n; i++)//遍历数组a,把它的值做为数组b的下标
	{
		int x = arr[i];
		if(b[x] == 0)//第一次出现记为1
		{
			b[x]+=1;
		}
		else//第二次出现记为0
		{
			b[x]-=1;
		}
	}
	for(i = 0; i < 10; i++)//对数组b遍历,找到数组b中哪两个下标对应的值不为0
	{
        if(b[i] != 0)
		{
			c[j] = i;//将这两个数存入数组c中
			j++;
		}
	}
}


int main()
{
	int i = 0;
	int c[2] = {0};//用来存储那两个只出现了一次的数字
	int a[] = {1,2,3,4,5,6,4,3,2,1,0,0};
       Find(a,c,sizeof(a)/sizeof(a[0]));
	for(i = 0; i < 2; i++)
	printf("%d ", c[i]);
	system("pause");
	return 0;
}

3.实现strcpy函数

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* My_strcpy(char *n_a, const char *n_b)
{
	char *p = n_a;//将首地址保存,防止找不到
	assert(n_a);
	assert(n_b);
        while(*n_a = *n_b)
	{		
		n_a++;
		n_b++;
	}
	return p;
}

int main()
{
	char *a = "AWEDFGTYGH";
	char b[] = "0";
	char *p = My_strcpy(b, a);

    printf("%s", p);
	system("pause");
	return 0;
}

4.实现strcat函数

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* My_strcat(char n_a[], char *n_b)
{
	int i = 0;
	char *ret = n_a;
	assert(n_a);
	assert(n_b);
	while(n_a[i] != '\0')
	{
                i++;
	}
	while(n_a[i] = *n_b)
	{
                i++;
		n_b++;
	}
	return ret;
}

int main()
{
	char a[] = "AWEDFGTYGH";
	char b[] = "ASDDDDFG";
	char *p = My_strcat(a, b);
    printf("%s", p);
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值