1.喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。
思路:
1. 20元首先可以喝20瓶,此时手中有20个空瓶子
2. 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty/2(两个空瓶子换的喝完后产生的瓶子) + empty%2(不够换的瓶子)
3. 如果瓶子个数超过1个,可以继续换,即重复2
方法二:按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1
int Total(int money)
{
return money * 2 - 1;
}
int main()
{
int money = 0;
scanf("%d", &money);
printf("%d\n", Total(money));
return 0;
}
2.打印菱形:
用C语言在屏幕上输出以下图案:
这种打印问题主要的方法就是找规律!
void func(int line)
{
//处理上半部分
for (int i = 0; i < line; i++)
{
//1.先打印空格
for (int j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
//2.打印星号
for (int k = 0; k < 2 * i + 1; k++)
{
printf("*");
}
printf("\n");
}
//处理下半部分
for (int i = 0; i < line - 1; i++)
{
//1.先打印空格
for (int j = 0; j < i + 1; j++)
{
printf(" ");
}
//2.打印星号
for (int k = 0; k < (line - 1 - i) * 2 - 1; k++)
{
printf("*");
}
printf("\n");
}
}
int main()
{
func(7);
return 0;
}
3.打印水仙花数:
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
此题的关键在于只要知道判断一个数据是否为水仙花数的方式,问题就迎刃而解。假定给定一个数据data,具体检测方式如下: 1. 求取data是几位数 2. 获取data中每个位置上的数据,并对其进行立方求和 3. 对data中每个位上的数据立方求和完成后,在检测其结果是否与data相等即可, 相等:则为水仙花数 否则:不是
#include <math.h>
void fun()
{
for (int i = 0; i < 100000; i++)
{
//计算有几位数?
int count = 0;
int tmp = i;
while (tmp != 0)
{
count++;
tmp /= 10;
}
tmp = i;//153
int sum = 0;
while (tmp != 0)
{
sum += pow(tmp % 10, count);
tmp /= 10;
}
if (sum == i)
{
printf("%d\n", i);
}
}
}
int main()
{
fun();
return 0;
}
4.计算求和
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
int Fun(int n ,int a)
{
int sum = 0;
int tmp = 0;
for (int i = 0; i < n; i++)
{
tmp = tmp * 10 + a;
sum += tmp;
}
return sum;
}
int main()
{
printf("%d\n", Fun(5, 2));
printf("%d\n", Fun(4, 2));
printf("%d\n", Fun(3, 2));
printf("%d\n", Fun(2, 2));
return 0;
}
5.斐波那契数:
法一:非递归
int fib(int n)
{
int a = 1;
int b = 1;
int c = 0;
if (n <= 2)
return 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int r = fib(n);
printf("%d\n", r);
return 0;
}
法2:递归
int fib(int n)
{
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int r = fib(n);
printf("%d\n", r);
return 0;
}
6.汉诺塔问题:
void move(char pos1, char pos2)
{
printf(" %c -> %c ", pos1, pos2);
}
// n :盘子个数
//pos1:起始位置
//pos2:中转位置
//pos3:目的位置
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)
{
move(pos1, pos3);
}
else {
Hanoi(n - 1, pos1, pos3, pos2);
move(pos1, pos3);
Hanoi(n - 1, pos2, pos1, pos3);
}
}
int main()
{
Hanoi(1, 'A', 'B', 'C');
printf("\n");
Hanoi(2, 'A', 'B', 'C');
printf("\n");
Hanoi(3, 'A', 'B', 'C');
printf("\n");
Hanoi(4, 'A', 'B', 'C');
printf("\n");
return 0;
}
7.递归实现n的k次方:
int Pow(int n, int k)
{
if(k==0)
return 1;
else if(k>=1)
{
return n*Pow(n, k-1);
}
}
8.打印一个数的每一位:
void Print(int n)
{
if (n > 9)
Print(n / 10);
printf("%d ", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
Print(n);
return 0;
}
9.求阶乘:
int fact(int n)
{
if (n == 1)
return 1;
else
return n * fact(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int c = fact(n);
printf("%d\n", c);
return 0;
}
10. 每位数之和:
int Fun(int n)
{
if (n < 10)
{
return n;
}
else
{
return Fun(n / 10) + n % 10;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int c = Fun(n);
printf("%d\n", c);
return 0;
}