几个简单的C算法题目

1、键盘输入x,y,求下面算数表达式的值
x+a%3*(x+y)%2/4

数据结构书上有这样的解法,是用堆栈,下次再补上。

6、已知公鸡5 元一只,母鸡3 元一只,雏鸡三只一元,问花100 元买100 只,应各有几只。

 再补。

10、猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上吃前一天剩下的一半零一个。到第十天早上想吃时,见只剩下一个桃子了。求第一天摘了多少桃子。

 

int fun(int n)
{
    int total
=0;
    
if(n==1)return 1;
    
return total+2*fun(n-1)+1;
}
main
()
{
    clrscr
();
    printf
("%d",fun(10));
}

 


16、一堆鸡蛋,3个3个数剩余2个,5个5个数剩余1个,7个7个数剩余3个,问这堆鸡蛋最少有多少个?

 再补。

21、由20 个正整数排成一圈,编一个程序找出连续的四个数,其和是最大的(不小于圈上任何其它连续的四个数之和)。

这里只做了五个数中找两个最大数的 。人懒嘛 。

 

void fun(int a[],int n)
{
    int i
,max[2]={0,0};
    
for(i=0;i<n;i++)
        
if(max[0]<(a[i]+a[(i+1)%n]))
        {
            max[
0]=a[i]+a[(i+1)%n];
            max[
1]=i;
        }
    printf
("%d=%d+%d",max[0],a[max[1]],a[(max[1]+1)%n]);
}
main
()
{
    int a[]
={6,2,3,4,5};
    clrscr
();
    fun
(a,5);
}

 

23、josephus问题,一群孩子围成一圈,任意假定一个数m从第一个小孩起顺时针方向数,每数到第m个小孩时,该小孩离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是获胜者。究竟获胜的是第几个小孩。

 再补。
27、编写最大公约数最小公倍数函数

最大公约数:

int fun(int x,int y)
{
    int temp
;
    
if(x<y)
    {
        temp
=x;
        x
=y;
        y
=temp;
    }
    
if(x%y==0)return y;
    
if(x%y==1)
        
return  1;
    
else
        
return fun(y,x%y);
}
main
()
{
    clrscr
();
    printf
("%d",fun(77,33));
}

 


28、已知如下与计算圆周率π有关的公式:
π/4 = 1 - 1/3 + 1/5 -1/7 + 1/9 - …
编一个程序计算π的近似值。精度要求:
(1)计算200 项得到的近似π;
(2)要求误差小于0.000001 的π的近似值。
(2)编写一个求π的函数,以最小误差为参数。

递归,关键是注意精度问题。

29、编写程序输出所有的水仙花数。所谓水仙花数是指一个三位数,其各位数的立方和等于该数。例如:153=1+125+27。

 

void find()
{
    int i
,a,b,c;
    
for(i=100;i<1000;i++)
    {
        a
=i/100;
        b
=i%100/10;
        c
=i%10;
        
if(i==(a*a*a+b*b*b+c*c*c))
            printf
("%d=%d(%d^3)+%d(%d^3)+%d(%d^3) ",i,a*a*a,a,b*b*b,b,c*c*c,c);
    }
}
main
()
{
    clrscr
();
    
find();
}

不知道还有没有最佳解。


30、将一张一元纸币兑换成一分、二分和五分的硬币,假定每种至少一枚,计算共有多少种兑换法并打印出各种兑换法。

 

fun()
{
    int x
,y,z,i=1;
    
for(x=1;x<100;x++)
        
for(y=1;y<50;y++)
            
for(z=1;z<20;z++)
            
if(100==(x+2*y+5*z))
            {
                printf
("%d:100=1*%d+2*%d+5*%d ",i++,x,y,z);
            }
}
main
()
{
    fun
();
}


31、“同构数”是指这样的整数:它恰好出现在其平方数的右端。如:376*376=141376。请找出10000以内的全部“同构数”。

 

void fun(int n)
{
    long int i
;
    int num
=1;
    
for(i=4;i<=n;i++)
    {
        
if(i<10&&(i*i-i)%10==0)
            printf
("%d:%ld,%ld ",num++,i*i,i);
        
else if(i<100&&(i*i-i)%100==0)
            printf
("%d:%ld,%ld ",num++,i*i,i);
        
else if(i<1000&&((i*i-i)%1000==0))
            printf
("%d:%ld,%d ",num++,i*i,i);
        
else if(i<10000&&((i*i-i)%10000==0))
            printf
("%d:%ld,%d ",num++,i*i,i);
    }
}
main
()
{
    clrscr
();
    fun
(10000);
}


32、 有12 人围坐成一圈(假设他们的编号沿顺时针方向依次为1 到12)。编程序,使用数组来存放各数据(人员编号),而后从1 号人员开始数起(沿顺时针方向),当数到k 时(其中k>1 由用户通过cin 输入指定),则该号人员被“淘汰出局”;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从1 开始数起,数到k 后,淘汰第2 个人;如此继续,直到最后剩下一个人时停止。请输出最后所剩那一个人的编号。

用循环链表应该是最好的解决办法,数据库知识快忘得差不多了,复习好了再写这个。

33、对一批编号为1-100全部开关朝上(开)的灯进行以下操作:  
    凡是1的倍数反方向拨一次开关;2的倍数反方向又拨一次开关;3的倍数反方向又拨一次开关...一直到100  
    问:最后为关熄状态的灯的编号。

int turn(int n)
{
    int i
,res=0;
    
for(i=1;i<=100;i++)
    {
        
if(n%i==0)
            res
=(res+1)%2;
    }
    
return res;
}
fun
()
{
    int j
=0,i,a[100];
    
for(i=0;i<100;i++)
        a[i]
=1;
    
for(i=0;i<100;i++)
    {
        
if(turn(i+1))
            a[i]
=0;
        
else
        {
            a[i]
=1;
            j
++;
        }
    }
    
for(i=0;i<100;i++)
        printf
("%3d:%d ",i+1,a[i]);
    printf
(" Total on is:%d",j);
}
main
()
{
    clrscr
();


    fun
();

}


34、27个小运动员在参加完比赛后,口渴难耐,去小店买饮料,饮料店搞促销,凭三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶?

 
int fun(int n)
{
    
if(n<3)return 0;
    
return n/3+fun(n%3+n/3);
}

main
()
{
    int i 
;
    clrscr
();
    
for(i=1;i<27;i++)
    {
        
if((i+fun(i))>=27)
        {
            printf
("BearCount:%d,Total:%d ",i,i+fun(i));
            
break;
        }
    }
    printf
(" %d",fun(i));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值