实验九 循环结构程序设计(2)
实验九 循环结构程序设计(2)
一、实验目的和要求:
1. 掌握循环结构程序的设计思想,以及程序执行过程;
2. 掌握while、do…while、for结构程序设计方法。
3. 掌握循环嵌套程序设计方法。
4. 掌握循环程序设计综合运用。
二、实验内容:
- 求100到300之间素数的个数。
- 编写程序,已知:S=1+3+5+7+9+…,求S不大于1000的最大值。 961
- 求500以内(含500)能被5或9整除的所有自然数的倒数之和。按四舍五入的方式精确到小数点后第二位。 1.48
- 已知一个数列的前三项为0,0,1,以后各项都是其相邻的前三项之和,求该数列前30项之和。 18947744
- 已知Fibonacci数列:1,1,2,3,5,8,……,它可由下面公式表述:
F(1)=1 if n=1
F(2)=1 if n=2
F(n)=F(n-1)+F(n-2) if n>2
试求F(2)+F(4)+F(6)+……+F(50)值。20365011073
- 爱因斯坦走台阶:有一台阶,如果每次走两阶,最后剩一阶;如果每次走三阶,最后剩两阶;如果每次走四阶,最后剩三阶;如果每次走五阶,最后剩四阶;如果每次走六阶,最后剩五阶;如果每次走七阶,刚好走完。求满足上述条件的最小台阶数是多少?如果是总共108级台阶,要怎样走才能刚好走完呢?
- 50元的整币兑换成5元、2元和1元币值(要求三种币值均有)的方法有多少种。106
- 求在[2,1000]之间的所有同构数之和。 1113
(同构数:某正整数的平方,其低位与该数本身相同。例如25^2=625,625的低位25与原数相同,则称25为同构数)
- 若两素数之差为2 ,则称两素数为双胞胎数,问[31,601]之间有多少对双胞胎数。 22
三、实验步骤与结果
1.求100到300之间素数的个数
(1)设计思路
不断的用循环模到数的本身,再判定
(2)程序源码(加注释)
#include <stdio.h> int main() { int i,j; for(i=100;i<=300;i++) //限制取的数的范围 { for(j=2;j<i;j++) //一直从2模到数的本身跳出循环 if(i%j==0) break; if(j==i) //当j累加到i的大小就打印 printf("%4d\n",i); } }
|
(3)运行结果与分析
2.编写程序,已知:S=1+3+5+7+9+…,求S不大于1000的最大值。 961
(1)设计思路
循环累加,超出范围跳出,不能多加和少加
(2)程序源码(加注释)
#include<stdio.h> void main() { int i,s=0; //定义数据类型并赋初值 for(i=1;;i=i+2) //循环i=i+2 { s=s+i; if(s>=1000) //判断限制是否达到 break; } printf("%d\n",s-i); //减去一个多加的i值打印输出 }
|
(3) 运行结果与分析
3.求500以内(含500)能被5或9整除的所有自然数的倒数之和。按四舍五入的方式精确到小数点后第二位。 1.48
(1)设计思路
数据类型定义正确,循环并判断和计算,按条件输出
(2)程序源码(加注释)
#include<stdio.h> void main() { int i; double s=0; //定义数据类型,并赋初值 for(i=1;i<=500;i++) //循环累加,判断跳出循环 { if(i%5==0 || i%9==0) //i的值模5和9是否没有余数 s+=1.0/i; //符合if语句才能执行 } printf("%.2f\n",s); //两位小数,打印输出 }
|
(3)运行结果与分析
4.已知一个数列的前三项为0,0,1,以后各项都是其相邻的前三项之和,求该数列前30项之和。
(1)设计思路
循环体外的值和内的值,前三项和给新的一项,求和计算
(2)程序源码(加注释)
#include <math.h> main() { int a[30],sum,i=3; //定义数据类型和数组范围 a[0]=0; a[1]=0; a[2]=1; //定义数组中元素的值 sum= a[0]+ a[1]+a[2]; //计算和赋值给sum while(i<30) //循环执行 { a[i]= a[i-1]+a[i-2]+a[i-3]; //计算出各项的值 sum=sum+a[i]; //各项的值不断和前三项的和相加 i++; } printf("%d\n",sum); //输出和的值
}
|
(3) 运行结果与分析
5.已知Fibonacci数列:1,1,2,3,5,8,……,它可由下面公式表述:
F(1)=1 if n=1
F(2)=1 if n=2
F(n)=F(n-1)+F(n-2) if n>2
试求F(2)+F(4)+F(6)+……+F(50)值。20365011073
(1)设计思路
前几项寄存在数组,模计算,求和
(2)程序源码(加注释)
#include <stdio.h>
int main(void) { long long arr[51]; //定义数据双长整型 long long sum = 1, i = 0; arr[0] = 1; arr[1] = 1; //数据赋初值 for (i = 2; i < 50; i++) //循环判断 { arr[i] = arr[i - 1] + arr[i - 2]; //计算前两项的和赋值给第三项 if (i % 2 != 0) { sum = sum + arr[i]; //求出前几项的和并赋值给下一项 } } for (i = 0; i < 51; i++) //满足限制范围的就打印各项的值 { printf("%lld\n", arr[i]); }
printf("%lld\n", sum); //打印最后的和值 return 0; } |
(3)运行结果与分析
6.爱因斯坦走台阶:有一台阶,如果每次走两阶,最后剩一阶;如果每次走三阶,最后剩两阶;如果每次走四阶,最后剩三阶;如果每次走五阶,最后剩四阶;如果每次走六阶,最后剩五阶;如果每次走七阶,刚好走完。求满足上述条件的最小台阶数是多少?如果是总共108级台阶,要怎样走才能刚好走完呢?
(1)设计思路
不断的取模判断
(2)程序源码(加注释)
#include <stdio.h>
int main(void) { int num = 0, i = 0; //定义数据并赋值 while (1) { num++; //累加 if ((num % 2 == 1 && num % 3 == 2) && (num % 4 == 3 && num % 5 == 4)) { if (num % 7 == 0 && num % 6 == 5) //满足了模2,3,4,5才能进行 { break; }
} } printf("%d\n", num); //输出num的值 printf("108阶台阶刚好走完可走:"); for (i = 1; i < 108; i++) { if (108 % i == 0) //能被108整除的数 { printf("%d ", i); } } return 0; } |
(3)运行结果与分析
7. 50元的整币兑换成5元、2元和1元币值(要求三种币值均有)的方法有多少种。106
(1)设计思路
钱的循环计算,满足限制条件
(2)程序源码(加注释)
#include <stdio.h>
int main(void) { int a = 1, b = 1, c = 50 - 5 * a - 2 * b; //定义数据类型并赋初值 int i = 1, count = 0; for (a = 1;a >= 1 && a < 10; a++) //循环判断5元是否满足限制条件 { for (b = 1; b >= 1 && b < 25; b++) //循环判断2元是否满足限制条件 { c = 50 - 5 * a - 2 * b; //50-五元的和两元的就是一元的 if (c > 0) { count++; //只要满足三张类型的币值都有就计数 printf("a = %d, b = %d, c = %d\n", a, b, c); } } } printf("%d", count); return 0; } |
(3)运行结果与分析
8. 求在[2,1000]之间的所有同构数之和。 1113
(同构数:某正整数的平方,其低位与该数本身相同。例如25^2=625,625的低位25与原数相同,则称25为同构数)
(1)设计思路
理解题意,然后求低位与该数比较
(2)程序源码(加注释)
#include <stdio.h>
int main(void) { int i = 2, sum = 0, a = 0, b = 0; //定义数据类型 for (i = 2; i <= 1000; i++) //循环判断是否超出范围 { a = i * i; b = i; while (a % 10 == b % 10) //判断正整数的平方的低位与该数本身相同 { if (b % 10 == b || b < 10) //满足条件的数 { sum += i; break; } a = (a - (a % 10)) / 10; b = (b - (b % 10)) / 10; } } printf("%d\n", sum); return 0; } |
(3)运行结果与分析
9. 若两素数之差为2 ,则称两素数为双胞胎数,问[31,601]之间有多少对双胞胎数。 22
(1)设计思路
在理解题意的基础上设计,先求素数,然后判断是否差为2
(2)程序源码(加注释)
#include <stdio.h>
int main(void) { int arr[600], i = 0, sum = 0, j = 0, count = 0; //定义数据类型和数组 for (i = 33; i <= 601; i++) //限制范围和i初值 { for ( j = 2; j < i; j++) //求素数 { if (i % j == 0) { break; } if (j == i - 1) { arr[count++] = i; } } } for (i = 1; i < count; i++) { if (arr[i] - arr[i - 1] == 2) //判断两个素数之间的差是否为2 { sum ++; } } printf("%d\n", sum); return 0; } |
(3)运行结果与分析
四、实验总结与心得
总结:
审题是关键,对题意理解了,然后就是设计程序。
心得:
利用自己知道的题型逐步设计程序
自己一定要记住一些模型,才能更快的编辑程序。