算法竞赛 入门经典(第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;
}

猜你喜欢

转载自blog.csdn.net/Charles___6/article/details/107850215