逝者如斯,不舍昼夜

尘世中一个迷途小书童,读书太少,想得太多
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

《算法竞赛入门经典》第一章精选

Posted on 2015-08-14 17:25  SteveWang  阅读(526)  评论(0编辑  收藏  举报

 

例1-2 三位数反转

 

  题目:程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7;输入740,输出应该是47。

  分析:用%10可以得到个位数,用/10%10可以得到十位数,用/100可以得到百位数。

  输入样例:

  123

  输出样例:
  321

  源码

#include<stdio.h>

int main()
{
    int n,a,b,c;
    scanf("%d",&n);
    a=n/100;    //原百位
    b=n/10%10;  //原十位
    c=n%10;     //原个位
    printf("%d",c*100+b*10+a);
    return 0;
}

 

  另一种:

#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    if(n%100==0)            //末尾两个0
        printf("%d",n/100);
    else if(n%10==0)        //末尾一个0
        printf("%d%d",n/10%10,n/100);
    else
        printf("%d%d%d",n%10,n/10%10,n/100);
    return 0;
}

 

例1-3 不借助第三者交换变量

 

#include<stdio.h>

int exchange_2_withoutOthers()
{
    int a,b;
    scanf("%d%d",&a,&b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("%d %d\n",a,b);

    return 0;
}

 

例1-4 鸡兔同笼

 

#include<stdio.h>

int chicken_rabbit()
{
    int n,m,x,y;    //n是鸡兔总数,m是总腿数,x是鸡的数目,y是兔的数目
    scanf("%d%d",&n,&m);
    x = 2*n-m/2;        //解方程组得
    y = m/2-n;
    if(m%2==1||x<0||y<0)    //若m是奇数则得到的x,y不是整数(因为m是总腿数所以从实际出发也容易理解),同时x,y必须是非负的
    {
        printf("No answer\n");
    }
    else
        printf("%d %d\n",x,y);

    return 0;
}

 

判断一个数是不是素数(质数)

 

int is_prime(int n)
{
    int i;
    for(i=2;i*i<=n;i++)    //n不能太大,因为i*i有可能溢出
        if(n%i==0)    return 0;    //合数
    return 1;    //素数(质数)
}

 

辗转相除法求最大公约数

 

#include<stdio.h>

int main()
{
    int m,n,t;
    scanf("%d%d",&m,&n);
    while(n!=0)
    {
        t=m%n;
        m=n;
        n=t;
    }
    printf("%d",m);
    return 0;
}