第21题~40题
第21题:
题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
解析:此题类似已知结果求原因,就从第10天出发,这里只剩一个桃子。那么第9天就剩 (1 + 1) * 2 = 4 个桃子,第8天就剩 (4 + 1 ) *2 = 10个,以此类推得到公式D(n-1) = ( D(n) + 1 ) *2。这里注意,逆向思考:将第10天作为第1天,然后按照公式依次叠加即可。
int Tao[10];
Tao[0] = 1;
for (int n = 1; n < 10; n++)
{
Tao[n] = ( Tao[n - 1] + 1 ) * 2;
}
printf("The number of Peach is %d in first day.", Tao[9]);
return 0;
第22题:
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
解析:首先,c不和x,z比。可以直接进行赋值c = ‘y’。然后用两个for循环去找到a与b的对手
//设置3个未知数用来寻找a,b,c所对应的3个人,a-i,b-j,c-k
char i, j, k;
k = 'y';
for (i = 'x'; i <= 'z'; i++)
{
//只要i不等于x与y,则跳出循环留下i的值
if (i != k && i != 'x')
break;
}
for (j = 'x'; j <= 'z'; j++)
{
//只要j不等于i与k,则跳出循环留下j的值
if (j != i && j != k)
break;
}
printf("顺序为:a--%c\t b--%c\t c--%c\t", i, j, k);
return 0;
第23题:
题目:打印菱形。
解析:用一个变量控制行数。在1到3行,打印星号的起点为4-行数,终点为4+行数。在5~7行,打印星号的起点为行数-4;这里唯一麻烦的是5 ~ 7行的终点:首先5 ~7行打印星号的终点为7,6,,5。但是行数为5,6,7所以这里需要加一个额外的变量来控制。
//我们用7 x 7 的矩阵来表示菱形
int row; //定义行数
row = 1;
int count = 2; //用于控制5~7行打印星号
while (row <= 7)
{
//中间第4行打印7个星号
if (row == 4)
{
for (int i = 1; i <= 7; i++)
printf("*");
printf("\n");
}
//其他行打印
else
{
//1~3行打印
if (row <= 3)
{
for (int i = 1; i <= 7; i++)
{
if (i>(4 - row) && i < (4 + row)) //这里 4-row 与 4+row 用来控制打印星号的起点与终点
printf("*");
else
printf(" ");
}
printf("\n");
}
//4~7行打印
else
{
for (int i = 1; i <= 7; i++)
{
if (i>(row-4) && i < (row+count)) //这里row-4 与 row+count 用来控制打印星号的起点与终点
printf("*");
else
printf(" ");
}
printf("\n");
count -= 2; //由于5~7行,行数在递增,但星号的个数在递减,需要加一个变量控制。
}
}
row++;
}
return 0;
第24题:
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
解析:分母与分子是很类似于斐波那契数列,当然也有些不同。在分母中,定义前2项,然后后面的每一项=前面二项之和。分子也是如此,唯一不同的是起始项不同。
//可以定义4个数,然后不断更新来解题。这里采用数组的方式
float Denominator[20]; //分母
float Molecule[20]; //分子
float result = 0;
Denominator[0] = 1;
Denominator[1] = 2;
Molecule[0] = 2;
Molecule[1] = 3;
for (int n = 0; n <= 19; n++)
{
if (n < 2)
{
result += Molecule[n] / Denominator[n];
}
else
{
Molecule[n] = Molecule[n - 1] + Molecule[n - 2];
Denominator[n] = Denominator[n - 1] + Denominator[n - 2];
result += Molecule[n] / Denominator[n];
}
}
printf("The result is %4.3f", result);
return 0;
注意:在定义数组的时候记得是float或者double。千万别定义成整型,因为整型的数据相除后还是整型。
第25题:
题目:求1+2!+3!+…+20!的和。
解析:采用函数与for循环的方法去求得最终结果。for循环从1~20,函数用于计算每个循环的乘积。
#include<stdio.h>
long double Factorial(int n);
int main(void)
{
int number;
long double sum = 0;
for (number = 1; number <= 20; number++)
{
sum += Factorial(number);
}
printf("The factorial sum is %lf", sum);
return 0;
}
long double Factorial(int n)
{
long double result = 1;
for (int i = n; i >= 1; i--)
result *= i;
return result;
}
注意:这里需要把返回值、函数中求阶乘的值以及最后的打印结果全部设置为long double 类型。因为这个数据量很大,若设置为int类型会导致数据丢失
第26题:
题目:利用递归方法求5!。
解析:递归在我理解的里:就是对一函数的循环调用,也可以说在定义的一个函数中不断的调用这个函数本身,直到满足if条件,再依次返回。最重要的便是递归一定不能忘记判断条件,不然就无限递归了。
#include<stdio.h>
int factorial(int);
int main(void)
{
int i = 5;
printf("%d! = %d\n", i, factorial(i));
return 0;
}
int factorial(int n)
{
int sum;
if (n == 0)
sum = 1;
else
sum = n * factorial(n - 1);
return sum;
}
第27题:
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
解析:我这里采用了指针的递归调用。先是输入一个字符串,然后存入数组中。用指针去调用数组的地址从尾部开始打印。
#include<stdio.h>
void Print(int,char *);
int main(void)
{
char input[5];
char str;
char *Input;
Input = &str;
printf("Please enter five chars.");
scanf("%s", &str);
for (int i = 0; i < 5; i++)
{
input[i] = *Input++;
}
Print(5,input);
}
void Print(int n,char *Input)
{
if (n == 0)
return;
else
{
printf("%c", *(Input + n - 1));
Print(n - 1,Input);
}
}
存在的问题:虽然结果没问题,但input数组在堆栈区崩溃了。所以如果为了没有一点问题,可以不采取指针递归调用的方法哦。我这里只是为了训练自己,然自己将知识更多的结合起来。
第28题:
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
解析:利用递归解决这个问题,和27题类似。从第一个出发,往回推即可。A1=10;A(n)= A(n-1) + 2,n≥2。
#include<stdio.h>
int age(int);
int main(int argc ,char *argv [])
{
printf("This fifth person's is %d", age(5));
return 0;
}
int age(int n)
{
int start;
if (n == 1)
start = 10;
else
start = age(n - 1) + 2;
return start;
}
第29题:
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
解析:用输入的数字依次去分解出万位,千位,百位,十位,个位。方法:取余再除即可完成分解。
#include<stdio.h>
int main()
{
int number;
int bit[5];
int count = 0; //用于计算几位
printf("Please enter a number:");
scanf("%d", &number);
bit[0] = number / 10000;
bit[1] = number % 10000 / 1000;
bit[2] = number % 1000 / 100;
bit[3] = number % 100 / 10;
bit[4] = number % 10;
for (int i = 4; i >= 0; i--)
{
if (bit[i])
count++;
printf("%d", bit[i]);
}
printf("\n");
printf("This number possess %d digits", count);
return 0;
}
第30题:
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
解析:类似于29题思路,完成分解后再加一步判断即可。
#include<stdio.h>
int main()
{
int number;
int bit[5];
int count = 0; //用于计算几位
printf("Please enter five digits:");
scanf("%d", &number);
bit[0] = number / 10000;
bit[1] = number % 10000 / 1000;
bit[2] = number % 1000 / 100;
bit[3] = number % 100 / 10;
bit[4] = number % 10;
if (bit[4] == bit[0] && bit[3] == bit[1])
printf("This %d is Palindrome number", number);
else
printf("This %d is not Palindrome number", number);
return 0;
}
第31题:
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
解析:用switch case 语句完成判断即可。
char ch1,ch2;
printf("Please enter the first letter.\n");
scanf("%c", &ch1);
while (getchar() != '\n') //处理保留的换行符
continue;
switch (ch1)
{
case 'm':
printf("monday\n");
case 't':
printf("Please enter the second letter.\n");
scanf("%c", &ch2);
if (ch2 == 'u')
{
printf("tuesday\n");
break;
}
if (ch2 == 'h')
{
printf("thursday\n");
break;
}
case 'w':
printf("wednesday\n");
break;
case 'f':
printf("friday\n");
break;
case 's':
printf("请输入下一个字母\n");
scanf("%c", &ch2);
if (ch2 == 'a')
{
printf("saturday\n");
break;
}
if (ch2 == 'u')
{
printf("sunday\n");
break;
}
default:
printf("error\n");
break;
}
return 0;
第32题:
题目:删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。
解析:用字符串函数strchr或者strrchr去找到想要删除的字符在字符串中的指针位置即可。
char words[30];
char ch;
char *ptr;
puts("Please enter the string: \n");
fgets(words, 30, stdin);
puts("Please enter the character you want to delete: \n");
scanf("%c", &ch);
while ((ptr = strchr(words, ch)) != NULL)
{
*ptr = ' ';
}
fputs(words, stdout);
return 0;
第33题:
题目:判断一个数字是否为质数。
解析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。那么这个题本质上也是对数不断拆分的过程。只要出现在2~输入的数的一半有能被整除的数说明这个数不是质数。
int number,i;
puts("Please enter a number:");
scanf("%d", &number);
for (i = 2; i <= (number / 2); i++)
{
if ((number % i) == 0)
{
printf("This %d is not a prime number", number);
break;
}
}
if (i == (number / 2 + 1))
{
printf("This %d is a prime number", number);
}
return 0;
第34题:
题目:练习函数调用。
解析:自定义一个函数,然后自己调用。简单写了个猜数的小游戏。
int funny(int);
int answer = 6;
int main(void)
{
int number;
printf("Please enter the guess number:");
scanf("%d", &number);
while (funny(number))
{
printf("Continue this game.Try again a number:");
scanf("%d", &number);
}
return 0;
}
int funny(int n)
{
if (n == answer)
{
printf("Congradulation you guess right \n");
return 0;
}
else if (n > answer)
{
printf("Sad,your guess is big \n");
return 1;
}
else
{
printf("Sad,your guess is small \n");
return 1;
}
}
第35题:
题目:字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”。
解析:使用指针从尾到头打印即可。当然你也可以用指针完成从尾头的数组改变,然后再打印。思路是类似的。
char str[30];
char *find;
int length;
puts("Please enter the string: \n");
fgets(str, 30, stdin);
find = strchr(str, '\n');
*find = '\0';
length = strlen(str);
find = str;
for (int i = length - 1; i >= 0; i--)
printf("%c", *(find + i));
return 0;
第36题:
题目:求100之内的素数。
解析:和第33题的思路是一样的,只是更改下数字即可。
int number,i,count;
count = 0;
for (number = 1; number <= 100; number++)
{
for (i = 2; i <= (number / 2); i++)
{
if ((number % i) == 0)
break;
}
if (i == (number / 2 + 1))
{
printf("%2d ", number);
count++;
}
if (count % 5 == 0)
printf("\n");
}
return 0;
第37题:
题目:对10个数进行排序。
解析:输入10个数字,然后使用冒泡排序法进行排序。
//采用升序排列
int i, j, k;
int number[10];
int temp; //用作交换时的临时变量
printf("Please enter ten numbers:\n");
for (i = 0; i < 10; i++)
scanf("%d", &number[i]);
for (j = 0; j < 9; j++)
{
for (k = j+1; k < 10; k++) //注意这里k要写成j+1,而不是0
{
if (number[j]>number[k])
{
temp = number[j];
number[j] = number[k];
number[k] = temp;
}
}
}
for (i = 0; i < 10; i++)
printf("%4d", number[i]);
第38题:
题目:求一个3*3矩阵对角线元素之和
解析:用双重for循环控制二维数组的输入,再用number[i][i]得到对角线元素之和
int number[3][3];
int i, j;
int sum = 0;
printf("Please enter 3 x 3 matrix:");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", &number[i][j]);
}
}
for (i = 0; i < 3; i++)
sum += number[i][i];
printf("%d", sum);
return 0;
第39题:
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
解析:先用37题的排序方法,将数组排好序。然后再输入一个数,按照排序规律放入数组中。插入的思路:输入的数去跟排好序的数组进行比对,然后得到第一个比输入大的数,记录下来。然后把数组第一个比他大的数放在数组的尾部,输入的数进行插队。再不停地数组进行交换即可。
//采用升序排列
int i, j, k,position;
int number[11];
int temp,Number; //用作交换时的临时变量
printf("Please enter ten numbers:\n");
for (i = 0; i < 10; i++)
scanf("%d", &number[i]);
for (j = 0; j < 9; j++)
{
for (k = j+1; k < 10; k++)
{
if (number[j]>number[k])
{
temp = number[j];
number[j] = number[k];
number[k] = temp;
}
}
}
for (i = 0; i < 10; i++)
printf("%4d", number[i]);
printf("\n");
printf("Please enter the number you want to inser:");
scanf("%d", &Number);
for (i = 0; i < 10; i++)
{
if (number[i]>Number)
{
position = i;
temp = number[i];
number[i] = Number;
number[10] = temp;
break;
}
}
for (i = position+1; i < 11; i++)
{
temp = number[i];
number[i] = number[10];
number[10] = temp;
}
for (i = 0; i < 11; i++)
printf("%4d", number[i]);
第40题:
题目:将一个数组逆序输出。
解析:与37题的思路是样的,只是将升序改为逆序。
//采用升序排列
int i, j, k;
int number[10];
int temp; //用作交换时的临时变量
printf("Please enter ten numbers:\n");
for (i = 0; i < 10; i++)
scanf("%d", &number[i]);
for (j = 0; j < 9; j++)
{
for (k = j+1; k < 10; k++)
{
if (number[j]<number[k])
{
temp = number[j];
number[j] = number[k];
number[k] = temp;
}
}
}
for (i = 0; i < 10; i++)
printf("%4d", number[i]);