目录
5.3 Fibonacci数列的前两个数为1, 1,以后每一个数都是其前两个数之和。求Fibonacci数列中的前20个数。用数组存放并按一行10个数的格式输出。
5.7 有17个人围成一圈(编号为1~17),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号?
5.11 有一行文字,要求删去其中某个字符。此行文字和要删除的字符均由键盘输入。
5.12 编写一个函数atoi,其作用是将一个整数字符串转换成一个整数。
5.15 数字螺旋方阵的形式如图所示。请将螺旋方阵存放在n×n的二维数组中,并将其打印输出。要求n由程序读入,数字螺旋方阵由程序自动生成。
5.16 有3行文字,找出其中共有多少空格和多少单词(规定单词之间以一个或多个空格作为间隔)。
5.17 有n个学生,每人考m门课。(1)找出成绩最高的学生的学号和课程号。(2)找出有不及格课程的学生的学号及其各门课的全部成绩。(3)求全部学生全部课程总平均分。
5.19 有n个国家名,要求按字母先后顺序排列,并按顺序输出。
一、习题
5.3 Fibonacci数列的前两个数为1, 1,以后每一个数都是其前两个数之和。求Fibonacci数列中的前20个数。用数组存放并按一行10个数的格式输出。
#include<stdio.h>
int main(){
int arr[20] = {0};
int i = 0;
arr[0] = 1;
arr[1] = 1;
for(i = 2; i < 20; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}
for(i = 0; i < 20; i++){
if(i != 0 && i % 10 == 0){
printf("\n");
}
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
5.7 有17个人围成一圈(编号为1~17),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号?
#include <stdio.h>
int main(){
int num[50], n, *p, j, loop, i, m, k;
printf("请输入这一圈人的数量:\n");
scanf("%d", &n);
p = num;//开始给这些人编号
for (j = 0; j < n; j++){
*(p + j) = j + 1;
}
i = 0;//i用于计数,即让指针后移
m = 0;//m记录退出圈子的人数
k = 0;//k报数1,2,3
while(m < n - 1){//当退出的人数不大于总人数时,即留下的人数至少是一个人
//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
if (*(p + i) != 0){//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
k++;
}
if (k == 3){
k = 0; //报数清零,即下一个人从1开始报数
*(p + i) = 0;//将报数为3的人编号重置为0
m++; //退出人数加1
}
i++; //指针后移
if (i == n){//如果到了队尾,就要使指针重新指向对头//并且它只能放在i++后面,因为只有i++了才有可能i==n
i = 0;
}
}
printf("现在剩下的人是:");
for (loop = 0; loop < n; loop++){
if (num[loop] != 0){
printf("%2d号\n",num[loop]);
}
}
return 0;
}
5.8 编写程序在屏幕上画一条正弦曲线。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int radian; //10倍弧度
double y; //y为y轴,值为-1到+1,步长为0.1;
int x; //用62列值代表x轴;62来源于2Pi*10约等于2*3.1*10;
//用反正弦值求x更加方便于按行输出
for(y=1; y>=-1; y-=0.1)
{
radian=asin(y)*10;
for(x=0;x<=62;x++)
{
if((x==radian)||(x==(31-radian)||(x==radian+61)))
//反余弦函数值域[0,pi]
printf("*");
else if(radian==0)
printf("-");
else
printf(" ");
}
printf("\n");
}
return 0;
}
5.9 用筛选法求100以内的素数。
#include<stdio.h>
//非筛选法
//int main(){
// int i, j, flag = 1;
// for(i = 2; i < 100; i++){
// flag = 1;
// for(j = 2; j < i; j++){
// if(i % j == 0){
// flag = 0;
// break;
// }
// }
// if(flag)
// printf("%d ", i);
// }
// return 0;
//}
//筛选法
int main(){
int i, j, a[100];
for(i = 0; i < 100; i++){
a[i] = i + 1;
}
a[0] = 0;//1不是素数,挖去
for(i = 0; i < 100; i++){
for(j = i + 1; j < 100; j++){
if(a[i] != 0 && a[j] != 0){//跳过已挖去的数
if(a[j] % a[i] == 0)
a[j] = 0;
}
}
}
printf("1-100的素数是:\n");
for(i = 0; i < 100; i++){
if(a[i] != 0){
printf("%d ", a[i]);
}
}
printf("\n");
return 0;
}
5.10 设计选择排序的C语言程序。
#include<stdio.h>
int main(){
int arr[10] = {32,5,6,10,8,13,25,17,9,12};
int i = 0, j = 0, min, temp;
printf("排序前:");
for(i = 0; i &