- 第21题:
- 第22题:
- 第23题:
- 第24题:
- 第25题:
- 第26题:
- 第27题:
- 第28题:
- 第29题:
- 第30题:
- 第31题:
- 第32题:
- 第33题:
- 第34题:
- 第35题:
- 第36题:
- 第37题:
- 第38题:
- 第39题:
- 第40题:
题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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--%ct b--%ct c--%ct", 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,函数用于计算每个循环的乘积。
#includelong 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第27题:int factorial(int); int main(void) { int i = 5; printf("%d! = %dn", i, factorial(i)); return 0; } int factorial(int n) { int sum; if (n == 0) sum = 1; else sum = n * factorial(n - 1); return sum; }
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
解析:我这里采用了指针的递归调用。先是输入一个字符串,然后存入数组中。用指针去调用数组的地址从尾部开始打印。
#includevoid 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第29题: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; }
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
解析:用输入的数字依次去分解出万位,千位,百位,十位,个位。方法:取余再除即可完成分解。
#include第30题: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; }
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
解析:类似于29题思路,完成分解后再加一步判断即可。
#include第31题: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; }
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
解析:用switch case 语句完成判断即可。
char ch1,ch2;
printf("Please enter the first letter.n");
scanf("%c", &ch1);
while (getchar() != 'n') //处理保留的换行符
continue;
switch (ch1)
{
case 'm':
printf("mondayn");
case 't':
printf("Please enter the second letter.n");
scanf("%c", &ch2);
if (ch2 == 'u')
{
printf("tuesdayn");
break;
}
if (ch2 == 'h')
{
printf("thursdayn");
break;
}
case 'w':
printf("wednesdayn");
break;
case 'f':
printf("fridayn");
break;
case 's':
printf("请输入下一个字母n");
scanf("%c", &ch2);
if (ch2 == 'a')
{
printf("saturdayn");
break;
}
if (ch2 == 'u')
{
printf("sundayn");
break;
}
default:
printf("errorn");
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 = ' ';
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]
temp = number[j];
number[j] = number[k];
number[k] = temp;
}
}
}
for (i = 0; i < 10; i++)
printf("%4d", number[i]);



