题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
个人总结:寻找规律
#include <stdio.h>
int rabbit(int n);
void main ()
{
int n, m;
printf("你需要查询第几个月兔子数:");
scanf("%d", &n);
m=rabbit(n);
printf("第%d个月兔子数量为%d\n", n, m);
}
int rabbit(int n)
{
if (n <= 0)
{
printf("error");
return 0;
}
if(n==1 || n==2)
return 1;
if (n > 2)
return rabbit(n-1)+rabbit(n-2);
}
题目2:判断101-200之间有多少个素数,并输出所有素数。
个人总结:素数=质数,指大于1的自然数中,除了1和此整数外,没法被其他自然数整除的数。1和0既非素数也非合数。
#include"stdio.h"
#include"math.h"
void main()
{
int m, n, i, found;
float t;
n = 0;
for(m = 101; m <= 200; m++){
t = sqrt(m);
for(i = 2; i <= t; i++){
if(m%i ==0){
found = 0;
break;
}
else
found = 1;
}
if(found){
printf("%d ", m);
n++;
}
}
printf("\n%d\n", n);
}
题目3:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
#include"stdio.h"
void main()
{
int m, a, b, c;
for(m = 100;m <= 999; m++){
a = m/100;
b = m/10%10;
c = m%10;
if(m == (a*a*a +b*b*b +c*c*c))
printf("%d ", m);
}
printf("\n");
}
题目4:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
个人总结:前面输出为x*,最后一个要判断他是否已经是素数了,是就直接输出。
#include"stdio.h"
#include"math.h"
int check(int x);
void main()
{
int x, i, n;
printf("please input a numble:");
scanf("%d",&x);
printf("%d=",x);
n = x;
i = 2;
while(check(x) != 1){
while(x%i == 0){
printf("%d*",i);
x = x/i;
}
i++;
}
printf("%d\n", x);
}
int check(int x)
{
int t, i, found;
t = sqrt(x);
for(i = 2; i <= t; i++){
if(x%i ==0){
found = 0;
break;
}
else
found = 1;
}
if(found)
return 1;
else
return 0;
}
题目5:输入两个正整数m和n,求其最大公约数和最小公倍数。
个人总结:辗除法比穷举法更高效!
①第一种解法,利用穷举
#include"stdio.h"
int maxGY(int m, int n);
int minGB(int m, int n);
void main()
{
int m, n, a, b;
printf("please input m, n:");
scanf("%d %d", &m, &n);
a = maxGY(m, n);
b = minGB(m ,n);
printf("最大公约数为:%d\n最小公倍数为:%d\n", a, b);
}
int maxGY(int m, int n)
{
int t, maxgy;
//m > n
if(m < n){
t = m;
m = n;
n = t;
}
t = n;
while((m%t != 0) || (n%t != 0))
t--;
return t;
}
int minGB(int m, int n)
{
int t;
//m > n
if(m < n){
t = m;
m = n;
n = t;
}
t = m;
while((t%m != 0) || (t%n != 0))
t++;
return t;
}
②第二种解法:利用辗除法
#include"stdio.h"
int gcd(int m, int n);
void main()
{
int m, n, a, b;
printf("请输入两个数:");
scanf("%d %d", &m, &n);
a = gcd(m, n);
b = m*n/a;
printf("最大公约数为:%d\n最小公倍数为:%d\n", a, b);
}
int gcd(int m, int n) {
int temp;
if(m < n) {
temp = n;
n = m;
m = temp;
}
if(m%n == 0)
return n;
else {
m %= n;
return gcd(n, m);
}
}
题目6:利用条件运算符((a>b)?a:b)的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
#include"stdio.h"
#define N 100;
void main()
{
int x;
scanf("%d",&x);
if((x >= 0) && (x <= 100)){
(x >= 90)? printf("A\n"):((x < 60)? printf("C\n"):printf("B\n"));
}
else
printf("error");
}