前言:昨天我们学习了C语言中循环结构程序设计,并分析了循环结构的特点和实现方法,有了初步编写循环程序的能力,那么今天我们通过一些例子来进一步掌握循环程序的编写和应用。
💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:C程序设计谭浩强版本 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
目录
- 斐波那契数列
- 判断素数
- 最大公约数和最小公倍数
- 统计字符个数
- 水仙花数
- 求"1000之内的完数"
斐波那契数列
例题1:求Fibonacci(斐波那契)数列的前40个数。这个数列有以下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13…,用数学方式表示为:
代码思路:
方法一:用非递归的思路解决
int main()
{
int num1 = 1;
int num2 = 1;
int i = 0;
int tmp = 0;
int sum = 0;
for (i = 0; i < 40; i++)
{
if (i < 3)
{
tmp = 1;
printf("%d ", tmp);//前两项是1所以直接输出即可
sum = 2;
}
else
{
tmp = num1 + num2;//第三项开始后一项是前两项的和
num1 = num2;//让后一项赋值给前一项
num2 = tmp;//同理
printf("%d ", tmp);
sum += tmp;//求和
}
}
printf("\n");
printf("sum = %d\n", sum);
return 0;
}
方法二:用递归
int Fibon1(int num)
{
if (num == 1 || num == 2)
{
return 1;
}
else
{
return Fibon1(num - 1) + Fibon1(num - 2);//用递归的方式
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fibon1(n);
printf("ret=%d", ret);
return 0;
}
运行结果:
判断素数
例题2:输入一个大于3的数,判定它是否为素数(prime)
代码分析:
#include <math.h>
int is_prime(int n)
{
int i = sqrt(n);//一个数如果是素数可以写成两个数相乘的形式
int flag = 1;//判断标志
while (i > 1)
{
if (n % i == 0)//如果被整除说明不是素数
{
int flag = 0;
return 0;
}
i--;
}
if (flag == 1)//如果flag = 1说明他没有整除
{
return 1;
}
}
int main()
{
int num = 0;
scanf("%d", &num);
if (is_prime(num))
{
printf("该数:%d是素数\n", num);
}
else
{
printf("该数:%d不是素数\n", num);
}
return 0;
}
运行结果:
例题3:求100到200之间的素数
代码分析:
#include <math.h>
int is_prime(int n)
{
int i = sqrt(n);//一个数如果是素数可以写成两个数相乘的形式
int flag = 1;//判断标志
while (i > 1)
{
if (n % i == 0)//如果被整除说明不是素数
{
int flag = 0;
return 0;
}
i--;
}
if (flag == 1)//如果flag = 1说明他没有整除
{
return 1;
}
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
if(is_prime(i))//判断是否是素数
printf("%d ", i);//是素数则打印i的值
}
return 0;
}
运行结果:
最大公约数和最小公倍数
例题4:输入两个正整数m和n,求其最大公约数和最小公倍数
代码分析:
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int min = m < n ? m : n;//找出其中的最小值;
while (1)
{
if (m % min == 0 && n % min == 0)//找到能同时能被它们俩整除的数
//如果能被整除说明是他们的最大公约数
{
break;
}
min -= 2;
}
int j = 1;
while (m * j % n != 0)//两个数的最小公倍数一定是它们俩个的倍数
//因此找到其中一个数的倍数,看他的倍数的积是否可以整除另一个数
{
j++;
}
printf("最大公约数是: %d 最小公倍数是: %d", min, m * j);
printf("\n");
return 0;
}
运行结果:
统计字符个数
例题4:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
代码分析:
int main()
{
char arr[100] = { 0 };
char ch = 0;
int i = 0;
int Eng_letter = 0;//英文字符
int space = 0;//空格
int number = 0;//数字
int others = 0;//其其它字符
while ((ch = getchar()) != '\n')//输入字符
{
arr[i++] = ch;
}
int len = strlen(arr);
for (i = 0; i < len; i++)
{
if ((arr[i] >= 'a' && arr[i] <= 'z') || (arr[i] >= 'A' && arr[i] <= 'Z'))//判断是否是英文字符
{
Eng_letter++;//是的话自增加1
}
else if (arr[i] >= '0' && arr[i] <= '9')//判断数字
{
number++;
}
else if (arr[i] == ' ')//判断空格
{
space++;
}
else
others++;//是否是其它的
}
printf("Eng_letter = %d number = %d space = %d others = %d", Eng_letter, number, space, others);
return 0;
}
运行结果:
水仙花数
例题5:输出所有的"水仙花数",所谓水仙花数是指一个3位数,其各位数字的立方和等于该数本身。例如153是水仙花数,因为153 =
1
3
+
5
3
+
3
3
1^3 + 5 ^ 3 + 3^3
13+53+33。
代码分析:
int Narcissistic_number(int n)
{
int sum = 0;
int y = n;
while (n != 0)//求出该数的 每一位数的3次方
{
int x = n % 10;//求出每一位数
sum += x * x * x;
n = n / 10;
}
if (sum == y)//判断是否等于它本身
{
return y;
}
else
return 0;
}
int main()
{
int i = 0;
int sum = 0;
for (i = 100; i < 1000; i++)
{
if (Narcissistic_number(i))
{
printf("%d ", Narcissistic_number(i));
}
}
return 0;
}
运行结果:
求"1000之内的完数"
例题6:一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,而6 = 1 + 2 + 3,因此6就是完数。编写程序找出1000以内的完数。
代码分析:
int if_factor(int n)
{
int sum = 0;
int i = 1;
while (i < n)
{
if (n % i == 0)//找出能被它整数的项,即找出因数
{
sum += i;
}
i++;
}
if (sum == n)//判断是否是完数
{
return sum;
}
else
return 0;
}
void factor(int n)//打印因数
{
int i = 1;
while (i < n)
{
if (n % i == 0)
{
printf("%d ", i);
}
i++;
}
}
int main()
{
int i = 0;
for (i = 2; i < 10000; i++)
{
if (if_factor(i))
{
printf("%d ", if_factor(i));//判断是否是完数
printf("因数是:");
factor(i);//打印出因数
printf("\n");
}
}
return 0;
}
运行结果:
结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。