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;
}