1、一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
找出这两个数字,编程实现。
思路分析:
让数组中的每个数字都与其他的数字进行比较(包括它自身),如果遇到相等的数字,则k++完成后,k为2,因为在定义的两层循环中,i,j各自独立,在比较的过程中,a[i]还会与自身比较(a[0]与a[0]比较,第一个a[0]是a[i]的,第二个a[0]是a[j]的),所以当k == 1时,说明数组中该数字只出现了一次。代码如下:
#include<stdio.h>
int Find(int arr[], int sz)
{
int i = 0;
int j = 0;
for(i=0; i<sz; i++)
{
int k = 0;
for(j=0; j<sz; j++)
{
if(arr[i] == arr[j])
{
k++;
}
}
if(k == 1)
{
printf("%d ",arr[i]);
}
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,5,1,2,3,6};
int sz = sizeof(arr)/sizeof(arr[0]);
Find(arr,sz);
return 0;
}
运行结果:
2、喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。
思路分析如下:首先得出未用空瓶子换时可以喝20瓶汽水,此时20个空瓶子可以换10瓶,依次类推,使用循环语句即可得出答案。
此题的难点在于用空瓶子换汽水时的代码实现,empty/2为第一次换完汽水后喝到的汽水数目,累加在之前喝到的汽水数目上,新得到的空瓶子数为empty/2 + empty%2。而只要empty>1,即有两个空瓶子时,就可以进行兑换,所以这是一个循环。
代码如下:
#include<stdio.h>
int main()
{
int num = 0; //喝到汽水的数目
int empty = 0; //空瓶子数目
int money = 20;
int price = 1;
empty = num = money/price; //一开始喝到的汽水数目
while(empty>1)
{
num += empty/2;
empty = empty/2 + empty%2;
}
printf("总共喝到的汽水数:%d ",num);
return 0;
}
结果为: