C语言经典100例
注:以下答案与原文不完全相同
实例51 - 与&
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main()
{
int a, b;
a = 077;
b = a & 3;
printf("a & b(decimal) 为 %d \n", b);
b &= 7;
printf("a & b(decimal) 为 %d \n", b);
return 0;
}
//a & b(decimal) 为 3
//a & b(decimal) 为 3
实例52 - 或
学习使用按位或 |。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
int main()
{
int a, b;
a = 077;
b = a | 3;
printf("b 的值为 %d \n", b);
b |= 7;
printf("b 的值为 %d \n", b);
return 0;
}
//b 的值为 63
//b 的值为 63
实例53 - 异或^
学习使用按位异或 ^。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
//0^0=0; 0^1=1; 1^0=1; 1^1=0 。
#include <stdio.h>
int main()
{
int a,b;
a=077;
b=a^3;
printf("b 的值为 %d \n",b);
b^=7;
printf("b 的值为 %d \n",b);
return 0;
}
//b 的值为 60
//b 的值为 59
实例54
取一个整数 a 从右端开始的 4~7 位。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main()
{
unsigned a,b,c,d;
printf("请输入整数:\n");
scanf("%o",&a);
b=a>>4;
c=~(~0<<4);
d=b&c;
printf("%o\n%o\n",a,d);
return 0;
}
//36
//36
//1
实例55 - ~
学习使用按位取反~。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main()
{
int a,b;
a=234;
b=~a;
printf("a 的按位取反值为(十进制) %d \n",b);
a=~a;
printf("a 的按位取反值为(十六进制) %x \n",a);
return 0;
}
/*
请输入整数:
a 的按位取反值为(十进制) -235
a 的按位取反值为(十六进制) ffffff15
*/
实例56
画图,学用circle画圆形。
#include <graphics.h>
//VC6.0中是不能运行的,要在Turbo2.0/3.0中
int main()
{
int driver,mode,i;
float j=1,k=1;
driver=VGA;
mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(YELLOW);
for(i=0;i<=25;i++)
{
setcolor(8);
circle(310,250,k);
k=k+j;
j=j+0.3;
}
return 0;
}
实例57
画图,学用line画直线(在TC中实现)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "graphics.h"
int main()
{
int driver,mode,i;
float x0,y0,y1,x1;
float j=12,k;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(GREEN);
x0=263;y0=263;y1=275;x1=275;
for(i=0;i<=18;i++)
{
setcolor(5);
line(x0,y0,x0,y1);
x0=x0-5;
y0=y0-5;
x1=x1+5;
y1=y1+5;
j=j+10;
}
}
实例58
学用rectangle画方形。(在TC中实现)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "graphics.h"
int main()
{
int x0,y0,y1,x1,driver,mode,i;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(YELLOW);
x0=263;y0=263;y1=275;x1=275;
for(i=0;i<=18;i++)
{
setcolor(1);
rectangle(x0,y0,x1,y1);
x0=x0-5;
y0=y0-5;
x1=x1+5;
y1=y1+5;
}
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
outtextxy(150,40,"How beautiful it is!");
line(130,60,480,60);
setcolor(2);
circle(269,269,137);
}
实例59
画图,综合例子。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
# define PAI 3.1415926
# define B 0.809
# include "graphics.h"
#include "math.h"
int main()
{
int i,j,k,x0,y0,x,y,driver,mode;
float a;
driver=CGA;mode=CGAC0;
initgraph(&driver,&mode,"");
setcolor(3);
setbkcolor(GREEN);
x0=150;y0=100;
circle(x0,y0,10);
circle(x0,y0,20);
circle(x0,y0,50);
for(i=0;i<16;i++)
{
a=(2*PAI/16)*i;
x=ceil(x0+48*cos(a));
y=ceil(y0+48*sin(a)*B);
setcolor(2); line(x0,y0,x,y);
}
setcolor(3);circle(x0,y0,60);
/* Make 0 time normal size letters */
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
outtextxy(10,170,"press a key");
getch();
setfillstyle(HATCH_FILL,YELLOW);
floodfill(202,100,WHITE);
getch();
for(k=0;k<=500;k++)
{
setcolor(3);
for(i=0;i<=16;i++)
{
a=(2*PAI/16)*i+(2*PAI/180)*k;
x=ceil(x0+48*cos(a));
y=ceil(y0+48+sin(a)*B);
setcolor(2); line(x0,y0,x,y);
}
for(j=1;j<=50;j++)
{
a=(2*PAI/16)*i+(2*PAI/180)*k-1;
x=ceil(x0+48*cos(a));
y=ceil(y0+48*sin(a)*B);
line(x0,y0,x,y);
}
}
restorecrtmode();
}
实例60
画图,综合例子2。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "graphics.h"
#define LEFT 0
#define TOP 0
#define RIGHT 639
#define BOTTOM 479
#define LINES 400
#define MAXCOLOR 15
int main()
{
int driver,mode,error;
int x1,y1;
int x2,y2;
int dx1,dy1,dx2,dy2,i=1;
int count=0;
int color=0;
driver=VGA;
mode=VGAHI;
initgraph(&driver,&mode,"");
x1=x2=y1=y2=10;
dx1=dy1=2;
dx2=dy2=3;
while(!kbhit())
{
line(x1,y1,x2,y2);
x1+=dx1;y1+=dy1;
x2+=dx2;y2+dy2;
if(x1<=LEFT||x1>=RIGHT)
dx1=-dx1;
if(y1<=TOP||y1>=BOTTOM)
dy1=-dy1;
if(x2<=LEFT||x2>=RIGHT)
dx2=-dx2;
if(y2<=TOP||y2>=BOTTOM)
dy2=-dy2;
if(++count>LINES)
{
setcolor(color);
color=(color>=MAXCOLOR)?0:++color;
}
}
closegraph();
}
实例61 - 杨辉三角形
打印出杨辉三角形(要求打印出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
#include <stdio.h>
int main()
{
int i, j;
int a[10][10];
printf("\n");
for (i = 0; i < 10; i++)
{
a[i][0] = 1;
a[i][i] = 1;
}
for (i = 2; i < 10; i++)
for (j = 1; j < i; j++)
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
for (i = 0; i < 10; i++)
{
for (j = 0; j <= i; j++)
printf("%5d", a[i][j]);
printf("\n");
}
return 0;
}
/*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
*/
实例62
学习putpixel画点,(在TC中实现)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "stdio.h"
#include "graphics.h"
int main()
{
int i,j,driver=VGA,mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(YELLOW);
for(i=50;i<=230;i+=20)
for(j=50;j<=230;j++)
putpixel(i,j,1);
for(j=50;j<=230;j+=20)
for(i=50;i<=230;i++)
putpixel(i,j,1);
}
实例63
画椭圆ellipse(在TC中实现)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "stdio.h"
#include "graphics.h"
#include "conio.h"
int main()
{
int x=360,y=160,driver=VGA,mode=VGAHI;
int num=20,i;
int top,bottom;
initgraph(&driver,&mode,"");
top=y-30;
bottom=y-30;
for(i=0;i<num;i++)
{
ellipse(250,250,0,360,top,bottom);
top-=5;
bottom+=5;
}
getch();
}
实例64
利用ellipse and rectangle 画图(在TC中实现)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "stdio.h"
#include "graphics.h"
#include "conio.h"
main()
{
int driver=VGA,mode=VGAHI;
int i,num=15,top=50;
int left=20,right=50;
initgraph(&driver,&mode,"");
for(i=0;i<num;i++)
{
ellipse(250,250,0,360,right,left);
ellipse(250,250,0,360,20,top);
rectangle(20-2*i,20-2*i,10*(i+2),10*(i+2));
right+=5;
left+=5;
top+=10;
}
getch();
}
实例65
一个最优美的图案(在TC中实现)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include "graphics.h"
#include "math.h"
#include "dos.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "stdarg.h"
#define MAXPTS 15
#define PI 3.1415926
struct PTS {
int x,y;
};
double AspectRatio=0.85;
void LineToDemo(void)
{
struct viewporttype vp;
struct PTS points[MAXPTS];
int i, j, h, w, xcenter, ycenter;
int radius, angle, step;
double rads;
printf(" MoveTo / LineTo Demonstration" );
getviewsettings( &vp );
h = vp.bottom - vp.top;
w = vp.right - vp.left;
xcenter = w / 2; /* Determine the center of circle */
ycenter = h / 2;
radius = (h - 30) / (AspectRatio * 2);
step = 360 / MAXPTS; /* Determine # of increments */
angle = 0; /* Begin at zero degrees */
for( i=0 ; i<MAXPTS ; ++i ){ /* Determine circle intercepts */
rads = (double)angle * PI / 180.0; /* Convert angle to radians */
points[i].x = xcenter + (int)( cos(rads) * radius );
points[i].y = ycenter - (int)( sin(rads) * radius * AspectRatio );
angle += step; /* Move to next increment */
}
circle( xcenter, ycenter, radius ); /* Draw bounding circle */
for( i=0 ; i<MAXPTS ; ++i ){ /* Draw the cords to the circle */
for( j=i ; j<MAXPTS ; ++j ){ /* For each remaining intersect */
moveto(points[i].x, points[i].y); /* Move to beginning of cord */
lineto(points[j].x, points[j].y); /* Draw the cord */
}
}
}
int main()
{
int driver,mode;
driver=CGA;mode=CGAC0;
initgraph(&driver,&mode,"");
setcolor(3);
setbkcolor(GREEN);
LineToDemo();
}
实例66
输入3个数a,b,c,按大小顺序输出。
#include <stdio.h>
int main()
{
int a, b, c;
int t;
printf("Please enter 3 numbers:\n");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
if (b > c)
printf("%d > %d > %d\n", a, b, c);
else
{
if(a > c)
printf("%d > %d > %d\n", a, c, b);
else
printf("%d > %d > %d\n", c, a, b);
}
}
else
{
if (b < c)
printf("%d > %d > %d\n", c, b, a);
else
{
if (a > c)
printf("%d > %d > %d\n", b, a, c);
else
printf("%d > %d > %d\n", b, c, a);
}
}
return 0;
}
/*
Please enter 3 numbers:
3 6 2
6 > 3 > 2
*/
#include <stdio.h>
void swap(int *s1, int *s2)
{
int t;
t = *s1;
*s1 = *s2;
*s2 = t;
}
int main()
{
int a, b, c;
int *p1, *p2, *p3;
printf("Please enter 3 numbers:\n");
scanf("%d %d %d", &a, &b, &c);
p1 = &a;
p2 = &b;
p3 = &c;
if (a > b)
swap(p1, p2);
if (a > c)
swap(p1, p3);
if (b > c)
swap(p2, p3);
printf("%d %d %d\n", a, b, c);
return 0;
}
/*
Please enter 3 numbers:
3 6 2
2 3 6
*/
实例67
输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
#include <stdio.h>
int main()
{
int num[10];
int m, n;
int t;
printf("Please enter 10 numbers:\n");
scanf("%d %d %d %d %d %d %d %d %d %d", &num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9]);
for (int i = 0; i < 10; i++)
{
m = 0;
for (int j = 0; j < 10; j++)
{
if (num[i] < num[j])
break;
else
m++;
}
if (m == 10)
{
t = num[0];
num[0] = num[i];
num[i] = t;
}
}
for (int i = 0; i < 10; i++)
{
n = 0;
for (int j = 0; j < 10; j++)
{
if (num[i] > num[j])
break;
else
n++;
}
if (n == 10)
{
t = num[9];
num[9] = num[i];
num[i] = t;
}
}
printf("%d %d %d %d %d %d %d %d %d %d\n", num[0], num[1], num[2], num[3], num[4], num[5], num[6], num[7], num[8], num[9]);
return 0;
}
/*
Please enter 10 numbers:
3 8 7 9 12 4 6 1 5 10
12 8 7 9 3 4 6 10 5 1
*/
实例68
有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。
#include <stdio.h>
int main()
{
int num[32];
int move[32];
int m, n;
printf("How many numbers?\n");
scanf("%d", &n);
printf("Please enter %d numbers:\n",n);
for (int i = 0; i < n; i++)
scanf("%d", &num[i]);
printf("How many positions do you want to move?\n");
scanf("%d", &m);
for (int i = 0; i < n - m; i++)
move[i + 3] = num[i];
for (int i = n - m; i < n; i++)
move[i - (n - m)] = num[i];
//打印你输入的数组
printf("before:\n");
for (int i = 0; i < n; i++)
printf("%3d ", num[i]);
printf("\n");
//打印滚动后的数组
printf("after:\n");
for (int i = 0; i < n; i++)
printf("%3d ", move[i]);
printf("\n");
return 0;
}
/*
How many numbers?
10
Please enter 10 numbers:
0
1
2
3
4
5
6
7
8
9
How many positions do you want to move?
3
before:
0 1 2 3 4 5 6 7 8 9
after:
7 8 9 0 1 2 3 4 5 6
*/
实例69
有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include <stdio.h>
int main()
{
int a[50];
int n, count;
int flag = 0;
printf("How many people?\n");
scanf("%d", &n);
count = n;
for (int i = 1; i <= n; i++)
a[i] = 1;//所有人都在圈内,为1
for (int i = 1; ; i++)
{
//如果i超出了n个人,表示已经循环一圈,重回到第1个人
if (i == n + 1)
i = 1;
if (a[i] != 0)
flag++;
else
continue;
if (flag % 3 == 0)
{
a[i] = 0;
count--;
}
if (count == 1)//表示只剩下一个人在圈内
break;
}
for (int i = 1; i <= n; i++)
if (a[i] != 0)
printf("The last people is %d", i);
return 0;
}
/*
How many people?
8
The last people is 7
*/
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
void 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]);
}
}
}
/*
请输入这一圈人的数量:
8
现在剩下的人是: 7号
*/
实例70
写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
#include <stdio.h>
int length(char *str)
{
int l = 0;
while (*str != '\0')
{
l++;
str++;
}
//or
/*
for (int i = 0; i < 64; i++)
{
if (isprint(str[i]) || ispunct(str[i]))
l++;
else
break;
}
*/
return l;
}
int main()
{
char str[64];
printf("Please enter a string:\n");
scanf("%s", str);
int len;
len = length(str);
printf("length = %d\n", len);
return 0;
}
/*
Please enter a string:
helloworld!
length = 11
*/
实例71
编写input()和output()函数输入,输出5个学生的数据记录。
#include <stdio.h>
#include<stdlib.h>
void input();
void output();
typedef struct
{
char name[20];
char sex[5];
int age;
}Stu;
int main()
{
Stu student[5];
printf("Please enter informations of 5 students: ");
printf("(Name Sex Age)\n");
input(student);
printf("Informations:\n");
output(student);
system("pause");
return 0;
}
void input(Stu *student)
{
for (int i = 0; i < 5; i++)
scanf("%s %s %d", student[i].name, &student[i].sex, &student[i].age);
}
void output(Stu *student)
{
for (int i = 0; i < 5; i++)
printf("%3s %3s %3d\n", student[i].name, student[i].sex, student[i].age);
}
/*
Please enter informations of 5 students: (Name Sex Age)
zzn m 20
hll m 19
yxj m 19
xzg m 20
yc m 22
Informations:
zzn m 20
hll m 19
yxj m 19
xzg m 20
yc m 22
*/
实例72-74:链表(暂未学习)
创建一个链表。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList CreateList(int n);
void print(LinkList h);
int main()
{
LinkList Head=NULL;
int n;
scanf("%d",&n);
Head=CreateList(n);
printf("刚刚建立的各个链表元素的值为:\n");
print(Head);
printf("\n\n");
system("pause");
return 0;
}
LinkList CreateList(int n)
{
LinkList L,p,q;
int i;
L=(LNode*)malloc(sizeof(LNode));
if(!L)return 0;
L->next=NULL;
q=L;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d个元素的值:",i);
scanf("%d",&(p->data));
p->next=NULL;
q->next=p;
q=p;
}
return L;
}
void print(LinkList h)
{
LinkList p=h->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
实例75
输入一个整数,并将其反转后输出。
#include <stdio.h>
int main()
{
int num;
int reverse = 0;
int t;
printf("Integer: ");
scanf("%d", &num);
while (num != 0)
{
t = num % 10;
reverse = reverse * 10 + t;
num = num / 10;
}
printf("reverse = %d\n", reverse);
return 0;
}
/*
Integer: 12345
reverse = 54321
*/
实例76
编写一个函数,
输入n为偶数时,调用函数求1/2+1/4+…+1/n,
当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。
#include <stdio.h>
double even(int n);
double odd(int n);
int main()
{
int n;
double sum;
double(*pfunc)(int);
printf("Integer: ");
scanf("%d", &n);
if (n % 2 == 0)
pfunc = even;
else
pfunc = odd;
sum = (*pfunc)(n);
printf("sum = %lf\n", sum);
return 0;
}
double even(int n)
{
double s = 0;
double a = 0;
for (int i = 2; i <= n; i = i + 2)
{
a = (double)1 / i;
s = s + a;
}
return s;
}
double odd(int n)
{
double s = 0;
double a = 0;
for (int i = 1; i <= n; i = i + 2)
{
a = (double)1 / i;
s = s + a;
}
return s;
}
实例77
填空练习(指向指针的指针)。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
#include<stdlib.h>
int main()
{
const char *s[]={"man","woman","girl","boy","sister"};
const char **q;
int k;
for(k=0;k<5;k++)
{
q=&s[k]; /*在这里填入内容*/
printf("%s\n",*q);
}
return 0;
}
实例78
找到年龄最大的人,并输出。请找出程序中有什么问题。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
struct man {
char name[20];
int age;
}
person[3] = { "li",18,"wang",25,"sun",22 };
int main()
{
struct man *q, *p;
int i, m = 0;
p = person;
q = p->name;
for (i = 0; i < 3; i++)
{
if (m < p->age)
{
m = p->age;
q = p;
}
p++;
}
printf("%s %d\n", q->name, q->age);
return 0;
}
实例79
字符串排序。
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void swap(char*str1,char*str2);
int main()
{
char str1[20],str2[20],str3[20];
printf("请输入3个字符串,每个字符串以回车结束!:\n");
fgets(str1, (sizeof str1 / sizeof str1[0]), stdin);
fgets(str2, (sizeof str2 / sizeof str2[0]), stdin);
fgets(str3, (sizeof str3 / sizeof str3[0]), stdin);
if(strcmp(str1,str2)>0)
swap(str1,str2);
if(strcmp(str2,str3)>0)
swap(str2,str3);
if(strcmp(str1,str2)>0)
swap(str1,str2);
printf("排序后的结果为:\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
return 0;
}
void swap(char*str1,char*str2)
{
char tem[20];
strcpy(tem,str1);
strcpy(str1,str2);
strcpy(str2,tem);
}
实例80
海滩上有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,
第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子?
#include<stdio.h>
int main()
{
int x;
int i = 0;
int j = 1;
while (i < 5)
{
x = 4 * j;
for (i = 0; i < 5; i++)
{
if (x % 4 != 0)
{
break;
}
x = (x / 4) * 5 + 1;
}
j++;
}
printf("%d\n", x);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int calc_peaches(int monkeys)
{
//猴子总数
int m = monkeys;
//猴子每次待分桃子数
int remain;
int i = 1;
while(1)
{
//最后一只猴子待分配的桃子数一定能被4整除
remain = 4 * i;
for (m=monkeys; m>0; m--)
{
// 每只猴子待分配的桃子数remain,满足(remain - 1) % 5 = 0
if ((remain - 1) % 5 != 0)
break;
// 除第一只猴子外,其他猴子待分配的桃子数remain,满足remain % 4 = 0
if (m > 1 && remain % 4 != 0)
break;
// 不是第一只猴子时,计算出上一只猴子待分配的桃子数
if (m > 1)
remain = remain*5/4 + 1;
else
break;
}
// 待分配的桃子已满足monkeys只猴子的分配要求
if (m == 1)
break;
// 不满足时,则说明最后一只猴子待分配的桃子数不对,更换后再试
else
i++;
}
return remain;
}
int main(void)
{
int monkeys;
printf("请输入猴子的数量: ");
scanf("%d", &monkeys);
printf("桃子总数: %d\n", calc_peaches(monkeys));
}
#include <stdio.h>
#define True 1
int main()
{
int monkeys = 5, remain_peach = 1, i, temp, k;
for (i = 0; i < monkeys;) // i=0表示第5只猴子
{
int flag = 0; // flag=0表示没有间断
while (True)
{
temp = remain_peach * 5 % 4;
if (temp == 0)
{
if (i == 0) // 这里需要注意,只有在计算第五只猴子的时候需要保留现场
k = remain_peach;
remain_peach = remain_peach * 5 / 4 + 1;
if (i == 0 || (flag == 0 && i != 0)) // 如果当前计算的是第五只猴子,或者不是第五只但是没有间断,就计算前一只猴子
{
i++;
break;
}
}
else
{
flag = 1;
if (i != 0) // 表示间断,且不是第五只猴子,那么就需要返回第五只猴子重新计算
{
i = 0;
remain_peach = k + 1; // 防止死循环
break;
}
remain_peach++;
}
}
}
printf("最少有 %d 个桃子", remain_peach);
}