几个简单的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、付费专栏及课程。

余额充值