算法竞赛 入门经典(第2版) 第二章习题答案 仅供参考

//习题2-1
#include <stdio.h>
#include <math.h>
int main()
{
    int A, B, C;
    for(int i = 100; i <= 999; i++)
    {
        A = i / 100;
        B = i / 10 % 10;
        C = i % 10;
        if(i == pow(A, 3) + pow(B, 3) + pow(C, 3))  printf("%d ", i);
    }
    return 0;
}



//习题2-2
#include <stdio.h>
int main()
{
    int a, b, c, i, count = 0;
    FILE *fin;
    fin = fopen("input.txt", "r");
    while(fscanf(fin, "%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", ++count, i);
                break;
            }
        }
        if(i == 101)  printf("Case %d: No answer\n", ++count);
    }
    fclose(fin);
    return 0;
}


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


//习题2-4
#include <stdio.h>
int main()
{
    FILE *fin;
    int m,n,count = 0;
    fin = fopen("data.txt", "r");
    fscanf(fin, "%d%d", &n, &m);
    while(m && n)
    {
        double s = 0;
        int i = n;
        for(; i <= m; i++)
        {
           s += 1.0/((double)i * (double)i);  //不强转为double就会int类型溢出
        }
        printf("Case %d: %.5f\n", ++count, s);
        fscanf(fin, "%d%d", &n, &m);
    }
    fclose(fin);
    return 0;
}


//习题2-5
//方法一:当c>16时,不能解决问题,因为浮点数的精度为小数点后16位
#include <stdio.h>
#include <math.h>
int main()
{
    FILE *fin, *fout;
    fin = fopen("data2.txt", "r");
    fout = fopen("output.txt", "w");
    int a, b, c, count = 0;
    fscanf(fin, "%d%d%d", &a, &b, &c);
    while(a && b && c)
    {
        double m = (double)a / b;  //小数第16位之后就开始不准了
        fprintf(fout, "Case %d: %.*f\n", ++count, c, m);  //floor函数原型为 double floor(double org);  返回值还是double型,所以输出时
                                                            //用%.*f输出
                //格式化输出(printf)的特殊用法。如printf(“% * . * lf\n”, 8, 4, (double)1/6); 会输出8个字宽保留4位小数的浮点数运算结果。
        fscanf(fin, "%d%d%d", &a, &b, &c);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}

//方法二,模拟竖式除法过程
#include <stdio.h>
int n,m[101];//n整数部分,m小数部分
int main()
{
    int a,b,c,i,k=0;
    FILE *fin, *fout;
    fin = fopen("data2.txt", "r");
    fout = fopen("output.txt", "w");
    fscanf(fin, "%d%d%d", &a, &b, &c);
    while(a && b && c)
	{
        k++;
        n = a / b;  //n是整数部分
        a = a % b;  //a是余数
        m[0] = 0;//十分位小数,可以进位为整数
        for(i=1; i<=c; i++)
		{
            m[i] = a * 10 / b; //第i个余数除以B的整数部分,也就是我们要求的小数的第i位
            a = a * 10 % b;    //第i个余数除以b的余数部分
        }
        if(a*10/b >= 5)//第C+1位,四舍五入
		{
            for(i=c; i>=0; i--)//进位处理
			{
                m[i] = m[i] + 1;  //进位操作
                if(m[i] < 10)
                    break;//若不存在进位,跳出循环
                else
                    m[i] -= 10;  //否则继续进行进位操作
            }
        }
        n = n + m[0];//整数部分进位处理。
        fprintf(fout, "Case %d: %d.", k, n);//打印整数部分及小数点
        for(i=1; i<=c; i++)
            fprintf(fout, "%d", m[i]);//打印小数部分。
        fprintf(fout, "\n");
        fscanf(fin, "%d%d%d", &a, &b, &c);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}


//习题2-6
#include <stdio.h>
int main()
{
    int x, y, z;
    for(x = 123; x <= 329; x++)
    {
        y = 2 * x;
        z = 3 * x;
        int flag = 0;
        int num[10] = {0};
        num[x/100]++; num[x%100/10]++; num[x%10]++;
        num[y/100]++; num[y%100/10]++; num[y%10]++;
        num[z/100]++; num[z%100/10]++; num[z%10]++;
        for(int i=1; i<=9; i++)
        {
            if(num[i] == 0)
            {
                flag = 1;
                break;
            }
        }
        if(!flag)
        {
            printf("%d %d %d \n", x, y, z);
        }
    }
    return 0;
}

大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值