《算法竞赛入门》-课后习题-Chapter 2

2-1 daffodil水仙花

#include <stdio.h>
int main()
{
    int i,a,b,c;
    for(i=100;i<=999;i++)
    {
        a=i/100;
        b=(i-a*100)/10;
        c=i-a*100-b*10;
        if(a*a*a+b*b*b+c*c*c==i)
            printf("%d\n",i);
        else continue;
    }
    return 0;
}

2-2 hanxin韩信

#include <stdio.h>
int main()
{int t,i,a,b,c;
    t=1;
    while(scanf("%d %d %d",&a,&b,&c)==3)
    {
        for(i=10;i<=100;i++)
        {
            if(i%3==a && i%5==b && i%7==c)
            {
               printf("case %d:%d\n",t,i);
               break;
            }
           if(i==100)
            printf("case %d:no answer\n",t);
        }
        t++;
    }
    return 0;
}

2-3 triangle倒三角形

#include <stdio.h>
int main()
{
    int n,i,k,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        for(t=0;t<i-1;t++)
            printf(" ");
        for(k=0;k<2*n-(2*i-1);k++)
            printf("*");
        printf("\n");
    }
    return 0;
}

  

2-4 subsequence 子序列的和

#include <stdio.h>
int main()
{int i,n,m,t=1;
    double sum;

    while(scanf("%d %d",&n,&m))
    {
        if(m==0 && n==0) break;
        for(i=n,sum=0;i<=m;i++)
        {
            sum=sum+1.0/i/i;             //陷阱:当使用i*i时会出现结果溢出
        }
        printf("case %d:%.5lf\n",t,sum);
        t++;

    }
}

2-5 decimal 分数化小数

#include <stdio.h>
int main()
{
    int a,b,c;
    double k;while(scanf("%d %d %d",&a,&b,&c))
    {
        if(a==0 && b==0 && c==0) break;
        k=(double)a/b;
        printf("%.*lf\n", c, k);           // 难点,任意保留c位小数
    }
    return 0;
}

2-6 permutation 排列

思路:先给数组a[10]全部赋0,拆分每一位数,赋1。若不重复,则有a[1]+a[2]+...a[9]=9

#include <stdio.h>
int main(void)
{
    int x, y, z, a[10] = {0};
    for(x = 100; x < 333; x++)
    {
        y = 2*x;
        z = 3*x;

        a[x/100] = a[x/10%10] = a[x%10] = 1;
        a[y/100] = a[y/10%10] = a[y%10] = 1;
        a[z/100] = a[z/10%10] = a[z%10] = 1;
        int i, s = 0;
        for(i = 1; i < 10; i++)
            s += a[i];
        if(s == 9)
            printf("%d\t%d\t%d\n", x, y, z);
        for(i = 1; i < 10; i++)
            a[i] = 0;
    }
    return 0;
}
时间: 2024-10-16 22:05:20

《算法竞赛入门》-课后习题-Chapter 2的相关文章

算法竞赛入门经典 习题2-10 排列(permutation)

习题2-10 排列(permutation) 用1,2,3,-,9组成3个三位数 abc, def, 和ghi,每个数字恰好使用一次,要求 abc:def:ghi = 1:2:3.输出所有解.提示:不必太动脑筋. 解题思路: 首先abc最小值只能为123,最大值329,才符合题意. 此题重点判断1-9中每个数字都需出现,不能重复.解决方法:利用数组a[1],..,a[9]分别表示1,2...,9是否出现,出现记为1,否则记为0,只需判断a[1]+...+a[9] == 9,如果为真,则每个数字出

算法竞赛入门经典习题2-10排列

问题:用1,2,3,...,9组成3个三位数abc,def,和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解.提示:不必太动脑筋. // 习题2-10 样例(permutation) #include <stdio.h> int main(void) { int x, y, z, a[10] = {0}; for(x = 100; x < 333; x++) { y = 2*x; z = 3*x; //令a[出现的数字] = 1 a[x/100] = a

算法竞赛入门经典 习题 3-5 3-6 进制转换

习题3-6 输入基数b(2<=b<=10)和正整数n(十进制),输出n的b进制表示. #include <stdio.h> #include <stdlib.h> #define MAXN 100 int a[MAXN]; int main(int argc, char *argv[]) { int b, n, i = 0, j; scanf("%d %d", &b, &n); while(n/b != 0 || n%b != 0)

算法竞赛入门经典 习题 2-10 排列(permutation)

习题 2-10 用1,2,3,....,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int abc, def, ghi; int a[10], count = 0; memset(a, 0, sizeof(a));

算法竞赛入门经典 习题3-1 分数统计 习题 3-2 单词的长度

习题3-1 分数统计 输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出. 任务1:分数均不超过100的非负整数 任务2:分数均不超过100的非负实数,但最多保留两位小数. 任务1 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 101 + 10 int a[MAXN]; int main(int argc, char *argv[]) { int n,

算法竞赛入门经典习题2-6 排列(permutation)

暴力解法: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int compare(const void *a, const void *b); 5 6 int main(int argc, char **argv){ 7 int i,j,k; 8 int arr[9]; 9 for(i=100;i<333;i++){ 10 for(j=200;j<666;j++){ 11 for(k=300;k<1000;k++){

算法竞赛入门经典习题2-3 韩信点兵

1 #include <stdio.h> 2 int main() 3 { 4 int i,a,b,c; 5 while(~scanf("%d %d %d",&a,&b,&c)) 6 { 7 i=9; 8 while(i++) 9 { 10 if(i>100) 11 { 12 printf("No answer\n"); 13 break; 14 } 15 if( i % 3 == a && i % 5 ==

算法竞赛入门经典习题2-1 位数

1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 int m,n=0; 5 while(scanf("%d",&m)!=EOF) 6 { 7 n=0; 8 while(m>0) 9 { 10 m/=10; 11 n++; 12 } 13 printf("%d\n",n); 14 } 15 return 0; 16 }

算法竞赛入门经典习题2-2 水仙花数

这题题目描述出错,应该是3次方: 1 #include <stdio.h> 2 3 int daffldil(int m) 4 { 5 int sum=0,temp; 6 while(m>0) 7 { 8 temp=m%10; 9 sum+=temp*temp*temp; 10 m/=10; 11 } 12 return sum; 13 } 14 15 int main(int argc, const char * argv[]) { 16 int m; 17 while(scanf(&

算法竞赛入门经典习题2-4 倒三角形

题目分析: 1.假设计数变量 i 从0开始: 2.第 i 行输出 i 个空格: 3.每行输出 (n-i)*2-1 个*: 4.注意换行 1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 int i,j,n,temp; 5 while(scanf("%d",&n)!=EOF) 6 { 7 for(i=0;i<n;i++) 8 { 9 for(j=0;j<i;j++) 1