下面的习题涉及的知识包括条件语句、循环语句、函数、指针等相关知识,需要有一定的学习基础
第一题:打印“水仙花数”
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
--------------------------------------------------------------------------------------------------------------------------
解析
通常情况下,要求某个整数的每一位,就要用到除10模10的思路,得到每一位剩下的就好办了
代码呈现
#include <stdio.h>
#include <math.h>
int main()
{
int n = 1;
int sum = 0;
for (int i = 0; i <= 100000; i++)
{
int tmp = i;
sum = 0;
n = 1;
while (tmp / 10)
{
n++;
tmp /= 10;
}//求出该数有多少位,用n表示
tmp = i;
while (tmp)
{
int res = pow(tmp % 10, n); //此处求的是每一位的n次方
sum += res; //然后把他们加起来
tmp /= 10; //下一位
}
if (sum == i)
printf("%d ", i); //打印水仙花数
}
return 0;
}
第二题:打印以下图案
-----------------------------------------------------------------------------------------------------------------------------
解析
主要求每行前面有多少空格,以及每行有多少 * 。
观察可得上半段空格数每行减少一个,而星星数每行增加2个
下半段空格数每行增加一个,星星数同上
代码呈现
#include <stdio.h>
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 k = 0; k < 1 + 2 * i; k++)
{
printf("*");
}
printf("\n");
}
for (int i = 0; i < line - 1; i++)
{
for (int j = 0; j <= i; j++)
{
printf(" ");
}
for (int k = 0; k < 2*(line-1-i)-1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
第三题:斐波那契数列
斐波那契数列:1,1,2,3,5,8……
规律:后一项为前两项之和
要求:求斐波那契数列第n项
方法1:函数递归
#include <stdio.h>
int rec(int n)
{
if (n <= 2)
return 1;
else
return rec(n - 1) + rec(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d", rec(n));
return 0;
}
方法2:
#include <stdio.h>
int fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n >= 3)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d", fib(n));
return 0;
}
以上题目对于初学者来说可能有些挑战,但是经过一定的训练之后,回头再看就发现并不难。