题目主要为菜鸟教程中觉得比较好的例题。
目录
ex1
ex2
ex3
ex4
ex5
ex6
ex7
ex8
ex9
ex10
ex11 汉诺塔问题
ex1
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
/*
解法一:将a视为循环变量
解法二:将x视为循环变量
a + 100 = x*x (1)
a + 100 + 160 = y*y (2)
2式减去1式得
(y-x)(y+x) = 168 (3)
由3式得
0 <= x <=y <= 168
由1式可得 a >= -100
由2式可得 a <= 168*168-100-160
*/
void ex3(void)
{
int a, x, y, min, max;
min = -100;
max = 168 * 168 - 100 - 160;
for (a = min; a <= max; a++)
{
x = (int)sqrt(a + 100);
y = (int)sqrt(a + 100 + 168);
if (x * x == a + 100 && y * y == a + 100 + 168)
{
printf("该数为%d\n", a);
}
}
}
void ex3_2(void)
{
int a, x, y;
for (x = 0; x <= 168; x++)
{
y = (int)sqrt(168 + x * x);
if ((y - x) * (y + x) == 168 && y>0 && y <= 168)
{
a = x * x - 100;
printf("该数为%d\n", a);
}
}
}
ex2
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
/*
解法一:递归法
解法二:循环
*/
int ex11_rabbit(int month)
{
int sum = 0;
if (month > 2)
{
sum = ex11_rabbit(month - 1) + ex11_rabbit(month - 2);
}
else
{
sum = 1;
}
return sum;
}
void ex11_rabbit2(void)
{
int f1 = 1, f2 = 1;
int i;
for (i = 0; i < 20; i++)
{
printf("%d\n%d\n", f1, f2);
f1 = f1 + f2;
f2 = f1 + f2;
}
}
ex3
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
void ex22(void)
{
char a, b ,c;
for (a = 'x'; a <= 'z'; a++)
{
for (b = 'x'; b <= 'z'; b++)
{
if (b != a)
{
for (c = 'x'; c <= 'z'; c++)
{
if (c != a && c != b)
{
if (a != 'x' && c != 'x' && c != 'z')
printf("a->%c,b->%c,c->%c\n", a, b, c);
}
}
}
}
}
}
ex4
删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母
*
1.创建一个比较数组,与字符串大小相同
2.将字符串与需要删除的字符进行比较,若相同,则将比较数组相应位置1
3.输出比较数组中不为1的位
*/
void ex32(void)
{
char s[21], del;
char cmp[21] = { 0 }, new[21] = { 0 };
int i;
int nub = 0;
printf("输入字符串(20个以内):\n");
scanf("%s", s);
getchar();
printf("输入需要删除的字符:\n");
scanf("%c", &del);
for (i = 0; i < strlen(s); i++)
{
if (s[i] == del)
{
cmp[i] = 1;
}
}
for (i = 0; i < strlen(s); i++)
{
if (cmp[i] != 1)
{
new[nub] = s[i];
nub++;
}
}
printf("删改后字符串为:\n%s", new);
}
ex5
????????有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
// 这个题目是一直循环报数,计数不清零,直到最后一个人为止
void ex69()
{
int num, i, peo, check;
int arr[50];
printf("请输入人数(小于50):");
scanf("%d", &num);
// 赋值
for (i = 0; i < num; i++)
{
arr[i] = i + 1;
}
// 用peo变量存储序号,当遇到3的倍数时,将对应数据元素置0
check = num;
peo = 0;
while (check != 1)
{
for (i = 0; i < num; i++)
{
// 排号
if (arr[i] != 0)
{
peo++;
if (peo % 3 == 0)
{
arr[i] = 0;
check--;
}
}
}
}
for (i = 0; i < num; i++)
{
if (arr[i] != 0)
{
printf("%d\t", arr[i]);
}
}
}
ex6
编写input()和output()函数输入,输出5个学生的数据记录。
struct Stu {
char name[20];
int number;
};
struct Stu stu[5];
void input(struct Stu* stu)
{
int i;
for (i = 0; i < 5; i++)
{
printf("请输入学生%d的姓名:", i+1);
scanf("%s", (*(stu+i)).name);
getchar();
printf("请输入学生%d的学号:", i+1);
scanf("%d", &(*(stu + i)).number);
getchar();
putchar('\n');
}
return;
}
void output(struct Stu* stu, int num)
{
int i;
for (i = 0; i < num; i++)
{
printf("学生%d的姓名:%s\n", i,(*(stu+i)).name);
printf("学生%d的学号:%d\n", i,(*(stu+i)).number);
putchar('\n');
}
return;
}
ex7
????????编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)。
double even(int a)
{
int i;
double sum = 0;
for (i = 2; i <= a; i += 2)
{
sum += (double)1 / i;
}
return sum;
}
double odd(int a)
{
int i;
double sum = 0;
for (i = 1; i < sum; i += 2)
{
sum += (double)1 / i;
}
return sum;
}
void ex76()
{
int a;
double sum;
printf("请输入一个正数:");
scanf("%d", &a);
if (a % 2 == 0)
{
sum = even(a);
}
else
{
sum = odd(a);
}
printf("%lf", sum);
return;
}
ex8
? ? ? ? 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?
/*
判断最后一次每份有几个桃子 res = (a-1)/5 * 4
分之前有 a = res/4 * 5 +1 个桃子,因此剩余桃子需要满足 res/4为整数这一条件
*/
void ex80()
{
int sum, res;
int ave = 1, i = 0;
while (i<5)
{
res = 4 * ave;
for (i = 0; i < 5; i++)
{
if (res % 4 != 0)
{
break;
}
sum = res / 4 * 5 + 1;
res = sum;
}
ave++;
}
printf("最少有%d个桃子", sum);
return;
ex9
????????计算字符串中子串出现的次数
void ex96()
{
int al, bl, i, j, k;
int cnt = 0;
char a[50], b[50];
printf("输入母串:");
scanf("%s", a);
getchar();
printf("输入子串:");
scanf("%s", b);
al = strlen(a);
bl = strlen(b);
for (i = 0; i <= al - bl; i++)
{
for (j = 0, k = 0; j < bl && b[j] == a[i + k]; j++, k++);
if (j == bl)
{
cnt++;
}
}
printf("子串出现%d次", cnt);
}
ex10
????????有两个磁盘文件A和B,各存放一行字母,把这两个文件中的信息合并,输出到一个新文件C中。
// 需要事先创建a.txt和b.txt
void ex99()
{
FILE *fp1 = NULL, *fp2 = NULL, * fp3 = NULL;
char a[100], b[100];
if ((fp1 = fopen("a.txt", "r")) == NULL)
{
printf("error:cannot open a.txt\n");
exit(0);
}
fgets(a, 50, fp1);
fclose(fp1);
if ((fp2 = fopen("b.txt", "r")) == NULL)
{
printf("error:cannot open b.txt\n");
exit(0);
}
fgets(b, 50, fp2);
fclose(fp2);
strcat(a, b);
if ((fp3 = fopen("c.txt", "w")) == NULL)
{
printf("error:cannot open c.txt\n");
exit(0);
}
fprintf(fp3, "%s", a);
fclose(fp3);
return;
}
ex11 汉诺塔问题
/*
汉诺塔问题
layer:层数
a:木块所在的塔座
b:借助的塔座
c:目标塔座
在递归时,默认fun(n-1)已经求出
移动时分为3步:
第一步:将a上方所有木块移动至b
第二步:将a最下面一块移动至c
第三步:将b上所有木块移动至c
*/
void hannuota(int layer, char a, char b, char c)
{
if (layer == 1)
{
printf("%c --> %c\n", a, c);
}
else
{
hannuota(layer - 1, a, c, b);
printf("%c --> %c\n", a, c);
hannuota(layer - 1, b, a, c);
}
}
|