");
elseprintf("太小了,重猜!
");
}
}
}
6、抓交通肇事犯
一辆卡车违反交通规则,撞人后逃跑。
现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。
甲说:
牌照的前两位数字是相同的;乙说:
牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:
四位的车号刚好是一个整数的平方。
请根据以上线索求出车号。
*问题分析与算法设计
按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
#include
#include
main()
{
intnum,i,j,k;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
if(i!
=j)
{
num=i*1000+i*100+j*10+j;
for(k=1;k*k<=num;k++)
if(k*k==num)
printf("num=%d,k=%d\n",num,k);
}
}
7、排队
把N个同学排成一排,由前向后按1,2,1,2......报数,报单数的走出队伍,报双数的向前靠拢重新组成一排,然后再1,2,1,2......报数,报单数的走出队伍,问剩下最后一个人时,这个人原来在哪个位置.(N由键盘输入)
#include
#include
structnode
{
intdata1;
intdata2;
structnode*next;
};
structnode*create_list(intn)
{
structnode*head,*p,*q;
inti;
head=(structnode*)malloc(sizeof(structnode));
head->data1=1;
head->data2=1;
p=head;
for(i=2;i<=n;i++)
{
q=(structnode*)malloc(sizeof(structnode));
q->data1=i;
q->data2=i;
p->next=q;
p=q;
}
p->next=NULL;
return(head);
}
structnode*delete_node(structnode*head,structnode*p)
{
structnode*q;
if(p==head)
{
head=p->next;
p->next=NULL;
}
else
{
q=head;
while(q->next!
=p)
q=q->next;
q->next=p->next;
}
free(p);
return(head);
}
main()
{
structnode*head,*p,*q;
intnum,i;
printf("请输入人数:
");
scanf("%d",&num);
head=create_list(num);
while(num>1)
{
p=head;
while(p)
{
if((p->data1)%2)
{
q=p;
p=p->next;
head=delete_node(head,q);
num--;
}
else
p=p->next;
}
p=head;
i=1;
while(p)
{
p->data1=i;
i++;
p=p->next;
}
}
printf("最后剩下的人原来的位置是%d\n",head->data2);
}
8、古堡算式
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ?
= EDCBA
他对华生说:
ABCDE应该代表不同的数字,问号也代表某个数字!
华生:
“我猜也是!
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把ABCDE 所代表的数字写出来。
#include
intfunc(longn,intm)
{
intnum[5],i=0,j;
longn1=n;
while(n1)
{
num[i++]=n1%10;
n1=n1/10;
}
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
{
if(num[i]==num[j])return0;
}
n1=n*m;
i=4;
while(n1)
{
if(n1%10!
=num[i--])return0;
n1=n1/10;
}
return1;
}
main()
{
longi;
intj;
for(i=10000;i<100000;i++)
for(j=2;j<10;j++)
if(func(i,j))
printf("%ld*%d=%d\n",i,j,i*j);
}
9、约瑟夫问题
15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:
30个人围成一个圆圈,从第一个人开始报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问教徒怎么站,才能使每次投入大海的都是非教徒。
#include
#include
#defineM15
#defineN15
structnode
{
intdata1;
//intdata2;
structnode*next;
};
structnode*create_list(intn)
{
structnode*head,*p,*q;
inti;
head=(structnode*)malloc(sizeof(structnode));
head->data1=1;
//head->data2=1;
p=head;
for(i=2;i<=n;i++)
{
q=(structnode*)malloc(sizeof(structnode));
q->data1=i;
//q->data2=i;
p->next=q;
p=q;
}
p->next=head;
return(head);
}
structnode*delete_node(structnode*head,structnode*p)
{
structnode*q;
if(p==head)
{
head=p->next;
p->next=NULL;
}
else
{
q=head;
while(q->next!
=p)
q=q->next;
q->next=p->next;
}
free(p);
return(head);
}
voidprint_list(structnode*head)
{
structnode*p;
printf("%5d",head->data1);
p=head->next;
while(p!
=head)
{
printf("%5d",p->data1);
p=p->next;
}
}
main()
{
structnode*head,*p,*q;
intnum=M+N,n;
head=create_list(M+N);
p=head;
while(num>N)
{
n=1;
while(n<9)
{
p=p->next;
n++;
}
q=p;
p=p->next;
head=delete_node(head,q);
num--;
}
print_list(head);
}
10、捕鱼问题
A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。
日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。
B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。
C、D、E依次醒来,也按同样的方法拿走鱼。
问他们合伙至少捕了多少条鱼?
#include
main()
{
inti;longnum=1;
for(i=1;i<=5;i++)
{num=(num*5)+1;
printf("num=%d\n",num);}
}
11、出售金鱼
买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。
问原来的鱼缸中共有几条金鱼?
*问题分析与算法设计
题目中所有的鱼是分五次出售的,每次卖出的策略相同;第j次卖剩下的(j+1)分之一再加1/(j+1)条。
第五次将第四次余下的11条全卖了。
假定第j次鱼的总数为X,则第j次留下:
x-(x+1)/(j+1)
当第四次出售完毕时,应该剩下11条。
若X满足上述要求,则X就是题目的解。
应当注意的是:
"(x+1)/(j+1)"应满足整除条件。
试探X的初值可以从23开始,试探的步长为2,因为X的值一定为奇数。
*程序说明与注释
#include
intmain()
{
inti,j,n=0,x;/*n为标志变量*/
for(i=23;n==0;i+=2)/*控制试探的步长和过程*/
{
for(j=1,x=i;j<=4&&x>=11;j++)/*完成出售四次的操作*/
if((x+1)%(j+1)==0)/*若满足整除条件则进行实际的出售操作*/
x-=(x+1)/(j+1);
else{x=0;break;}/*否则停止计算过程*/
if(j==5&&x==11)/*若第四次余下11条则满足题意*/
{
printf("Thereare%dfishesatfirst.\n",i);/*输出结果*/
n=1;/*控制退出试探过程*/
}
}
}
12、亲密数
如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。
求3000以内的全部亲密数。
*问题分析与算法设计
按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。
计算数a的各因子的算法:
用a依次对i(i=1~a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则i就不是a的因子。
*程序说明与注释
#include
intmain()
{
inta,i,b,n;
printf("Therearefollowingfriendly–numberspairsmallerthan3000:
\n");
for(a=1;a<3000;a++)/*穷举1000以内的全部整数*/
{
for(b=0,i=1;i<=a/2;i++)/*计算数a的各因子,各因子之和存放于b*/
if(!
(a%i))b+=i;/*计算b的各因子,各因子之和存于n*/
for(n=0,i=1;i<=b/2;i++)
if(!
(b%i))n+=i;
if(n==a&&a
printf("%4d..%4d",a,b);/*若n=a,则a和b是一对亲密数,输出*/
}
}
13.完全数
如果一个数恰好等于它的因子之和,则称该数为“完全数”。
*问题分析与算法设计
根据完全数的定义,先计算所选取的整数a(a的取值1~1000)的因子,将各因子累加于m,若m等于a,则可确认a为完全数。
*程序说明与注释
#include
intmain()
{
inta,i,m;
printf("Therearefollowingperfectnumberssmallerthan1000:
\n");
for(a=1;a<1000;a++)/*循环控制选取1~1000中的各数进行判断*/
{
for(m=0,i=1;i<=a/2;i++)/*计算a的因子,并将各因子之和m=a,则a是完全数输出*/
if(!
(a%i))m+=i;
if(m==a)
printf("%4d",a);
}
printf("\n");
}
14、加密
题目:
某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:
每位数字都加上5,然后除以10,用余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
编程实现输入一个电话号码,得到加密后的数字。
1.程序分析:
2.程序源代码:
#include
main()
{inta,i,aa[4],t;
scanf("%d",&a);
aa[0]=a%10;
aa[1]=a%100/10;
aa[2]=a%1000/100;
aa[3]=a/1000;
for(i=0;i<=3;i++)
{aa[i]+=5;
aa[i]%=10;
}
for(i=0;i<=1;i++)
{t=aa[i];
aa[i]=aa[3-i];
aa[3-i]=t;
}
for(i=3;i>=0;i--)
printf("%d",aa[i]);
}
15、巧夺偶数
桌子上有25颗棋子,游戏双方轮流取子,每人每次最少取走一颗棋子,最多可取走3颗棋子。
双方照这样取下去,直到取光所有的棋子。
于是双方手中必然一方为偶数,一方为奇数,偶数方为胜者。
请编程实现人机游戏。
#include"stdio.h"
main()
{
inta,s,w,i;
a=25;
s=0;
w=0;
while(a!
=0)
{
i=rand()%3+1;
printf("这次机器取的粒数是:
%d\n",i);
if(a>i)
{
s=s+i;
a=a-i;
}
else
{
s=s+a;
a=0;
}
while
(1)
{
printf("请输入你这次要取的粒数:
");
scanf("%d",&i);
if(i<=3&&i>=1)break;
elseprintf("输入不正确,请重新输入1~3之间的数:
\n");
}
if(a>i)
{
w=w+i;
a=a-i;
}
else
{
w=w+a;
a=0;
}
}
printf("你一共取的粒数是:
%d,机器一共取的粒数是:
%d,",w,s);
if(w%2==0)
printf("所以你赢了\n");
elseprintf("所以你输了\n");
}
16数字移动
在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:
只能将数字沿线移向空白的点.请编程显示数字移动过程。
#include
inta[8]={0,1,2,5,8,7,6,3};
intb[9];
intc[8];
intcount=0;
voidshow_screen()
{
inti;
printf("第%2d次移动\n",count++);
for(i=0;i<9;i++)
if(i%3==2)printf("%2d\n",b[i]);
elseprintf("%2d",b[i]);
}
intmain()
{
inti,j,k,t;
voidshow_screen();
printf("请输入8个1~8之间的数字:
\n");
for(i=0;i<8;i++)
scanf("%d",&b[a[i]]);
show_screen();
t=-1;
for(j=0;j<8;j++)
{
if(b[a[j]]==1)
{
t=j;break;
}
}
for(j=0;j<8;j++)
c[j]=a[(j+t)%8];
for(i=2;i<9;i++)//i:
正在处理的数字,
for(j=i-1;j<8;j++)
if(b[c[j]]==i&&j!
=i-1)
{
b[4]=i;
b[c[j]]=0;show_screen();
for(k=j;k!
=i-1;k--)
{
b[c[k]]=b[c[k-1]];
b[c[k-1]]=0;
show_screen();
}
b[c[k]]=i;
b[4]=0;
show_screen();
}
elseif(b[c[j]]==i)break;//数字i在正确的位置
}