喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给n元,可以喝多少汽水(编程实现)。
1. 1元-->1瓶汽水
2. 2元-->3瓶汽水
3. 3元-->5瓶汽水
4. 4元-->7瓶汽水
5. 5元-->9瓶汽水
............
为了方便理解,我们以5元进行详细举例:
那么接下来,我们可以根据逻辑实现代码
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//金额
int money = 0;
printf("请输入金额:");
scanf("%d", &money);
//初始化空瓶数
int empty = money;//n元可以买n瓶,就有n个空瓶
//初始化可买汽水总瓶数
int sum = money;
//计算空瓶能换到的汽水瓶数
while (empty > 1)//2瓶换1瓶
{
sum += empty / 2;
empty = empty % 2 + empty / 2;
}
printf("%d元可以买%d瓶汽水\n", money, sum);
return 0;
}
我们多试几次会发现:
5-->9 2*5-1
6-->11 2*6-1
7-->13 2*7-1
所以,我们可以得到规律:n个空瓶可以换到(2*n-1)瓶汽水
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//金额
int money = 0;
printf("请输入金额:");
scanf("%d", &money);
//初始化空瓶数
int empty = money;//n元可以买n瓶,就有n个空瓶
//初始化可买汽水总瓶数
int sum = money;
//计算空瓶能换到的汽水瓶数
sum = empty * 2 - 1;
printf("%d元可以买%d瓶汽水\n", money, sum);
return 0;
}
用C语言在屏幕上输出以下图案:
我们很容易发现*是在13*13的矩形里面的,以最中间一行为对称轴,上下6行轴对称;
以最中间一列为对称轴,左右列轴对称。
从轴对称的角度出发,我们先找到每一行的对称轴,区分上下部分,然后左右打印相等个数的*,其余地方空格
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int arr[13][13] = {};
int sz = sizeof(arr) / sizeof(arr[0]);
int left, right;
int mid = sz / 2;
for (int i = 0; i < sz; i++)
{
//判断上下部分
//确定左右界限
if ((i > mid) && (i < sz))
{
int z = sz - 1 - i;
left = mid - z;
right = mid + z;
}
else
{
left = mid - i;
right = mid + i;
}
for (int j = 0; j < sz; j++)
{
//打印中间的*
if ((j <= right) && (j >= left))
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
我们也可以从空格和*个数规律切入:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//打印上半部分
int line = 0;
scanf("%d", &line);
for (int i = 0; i < line; i++)
{
//空格数
for (int j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
//*个数
for (int j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
for (int i = 0; i < line - 1; i++)
{
//空格数
for (int j = 0; j < i+1 ; j++)
{
printf(" ");
}
//*个数
for (int j = 0; j < 2 * (line - 1 - i)-1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
想要得到相应的水仙花数,我们需要知道它是几位数,然后得到每位对应的数字,再根据位数确定求和次方并求和,最后再判断是不是水仙花数
求次方,我们需要一个库函数:pow( )
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
for (int i = 0; i < 1000000; i++)
{
int count = 1;//一位数也有水仙花数
int tmp = i;//利用tmp获得i的位数和求和
int sum = 0;
//判断位数
while (tmp > 10)
{
count++;
tmp = tmp / 10;
}
tmp = i;//确保tmp代表i
//次方求和
while (tmp)
{
sum += pow(tmp % 10, count);
tmp = tmp / 10;
}
//判断是否是水仙花数
if (sum == i)
{
printf("%d\n", i);
}
}
return 0;
}
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
很明显,根据题目意思,C和D肯定有一个人撒谎
1.C假D真
凶手是C
2.D假C真
B和C矛盾,不成立
所以,我们需要根据题目意思分为真假2种,真为1,假为0;真假相加为3则找出凶手
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
char A, B, C, D;
char killer = 0;
for (killer = 'A'; killer<= 'D';killer ++)
{
if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
{
printf("凶手是%c\n", killer);
}
}
return 0;
}
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);
我们仔细分析,对于杨氏矩阵来说,右上角和左下角的元素是有特点的。右上角的元素是一行中最大的,一列中最小的。左下角的元素是一行中最小的,是一列中最大的。所以我们可以从右上角或者左下角开始查找。
比如:从右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。然后依然找右上角的元素继续和要查找的元素与比较。这样每一次比较去掉一行或者去掉一列。这个查找效率是高于遍历数组元素的,所以时间复杂度是小于O(N),也满足题目要求。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int findnum(int arr[3][3], int x, int y, int key)
{
//从右上角开始遍历
int i = 0;
int j = y - 1;
while (j >= 0 && j < x)
{
if (arr[i][j] > key)
{
j--;
}
if (arr[i][j] < key)
{
i++;
}
else
{
return 1;
}
}
}
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,11} };
if (findnum(arr, 3, 3, 11))
{
printf("It has been found!\n");
}
else
{
printf("It hasn't been found!\n");
}
return 0;
}
PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!
如果对你有帮助的话,记得点赞+收藏⭐️+关注➕