目录
1、喝汽水问题
如题:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
思路:给20元可以买20瓶汽水,这20瓶汽水喝完还有20个空瓶,这二十个空瓶又可以换10瓶个瓶子,这是个瓶子又可以换5个瓶子,这5个瓶子又可以换2个瓶子,最后手里还剩一个瓶子。一共是20+10+5+2+1+1=39个。在编程式,我们要了解的是初始的瓶子数量是跟给的钱有关的,给多少钱就有多少初始瓶子,然后用这些瓶子不断除以2,累加,这就需要将瓶子这个变量放到while的循环中累加。具体代码如下:
int main()
{
int money = 0;
scanf("%d", &money);
int empty = money;
int sum = money;
while (empty >= 2) //大于2才能换
{
sum += empty/2;
empty = empty / 2 + empty % 2; //empty%2 最后还剩1一瓶
}
printf("%d\n",sum);
return 0;
}
2、数组调整
如题:调整数组使奇数全部都位于偶数前面
思路:先初始化一个数组,arr[10]={1,2,3,4,5,6,7,8,9,10},接着要从循环里面找,题目要求奇数全部位于偶数前面,所以从数组的左边找偶数,从数组的右边找奇数,找到后使它们交换位置即可。所以要将这两个寻找的下标元素放到while循环中即可。
具体代码如下:
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left < right)
{
while ((left<right)&&(arr[left] % 2 == 1)) //向右找偶数,找到了跳出来
{
left++;
}
while ((left < right)&&(arr[right] % 2 == 0)) //向左找奇数,找到了跳出来
{
right--;
}
if (left < right)
{
int temp=arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
注意:在两个while找奇数偶数的的循环中,添加了条件(left<right),为的是防止在初次进到循环时,如果数组都为偶数或者奇数,那么会导致left 或者right 会有越界的问题。
3、杨辉三角
思路:杨辉三角可以看作一个二维数组,先给定这个数组为10行10列,数组的第一列和每一行的的最后一列都为1,即当 j=0,i=j时,数组的内容的1,从第三行、第二列开始,数组元素的内容为上一行上一列的值加上上一行同列的值之和,代码如下:
int main()
{
int arr[10][10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
int j = 0;
for (j = 0; j <= i; j++)
{
if (j ==0)
arr[i][j] = 1; // 先把第一行打印出来
if (i == j)
arr[i][j] = 1;
if (i > 1 && j > 0)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
4、真假测试
如题:
思路:如果按照正常得思维,要先假设这四个人有三个人说了真话,其中有一个说了假话,然后逐一排查,最后得到正确的结果,但是这些比较麻烦,过程非常繁琐。可以直接假设凶手,然后看话中正确与否。
假设A为凶手,则A是假话,B是假话,C是假话,D是真话,不符合题目要求
假设B为凶手,A是真话,B是假话,C是假话,D是真话,也不符合题目要求
假设C为凶手,A是真话,B是真话,C是假话,D是真话,符合题目要求
假设D为凶手,A是真话,B是假话,C是真话,D是假话,不符合题目要求。
综上可知,通过逻辑推理,可知C为凶手,但是如何用计算机编程实现,可以定义一个变量为凶手,让这个变量依次循环,如果符合条件,则可以输出。
四个人说的话用计算机语言描述为:
A : killer != ‘A ’ , B:killer==‘C’ ,C:killer==D”, D:killer != ‘D’;
int main()
{
char killer = 0;
int i = 0;
for (killer = 'A'; killer<= 'D'; killer++)
{
if (((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D')) ==3 )
{
printf("%c\n", killer);
}
}
return 0;
}
5、猜名次
思路:参考上题。
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 1; a <= 5; a++)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; e++)
{
if (((b == 2) + (a == 3) == 1) && ((b == 2) + (e == 4) == 1) && ((c == 1) + (d == 2) == 1) && ((c == 5) + (d == 3) == 1) && ((e == 4) + (a == 1) == 1))
{
if (a*b*c*d*e==120)
printf("a=%d ,b=%d, c=%d, d=%d, e=%d ", a, b, c, d, e);
}
}
}
}
}
}
return 0;
}