算法竞赛入门经典-第二章源代码

// 程序2-2 7744问题(1)
#include <stdio.h>
#include <math.h>
int main(void)
{
    int a, b, n;
    double m;
    for(a = 1; a <= 9; a++)
        for(b = 0; b <= 9; b++){
            n = a*1100 + b*11;
            m = sqrt(n);
            if(floor(m+0.5) == m)    // 判断整数需要它和它的整数部分比较
                printf("%d\n", n);
        }
    return 0;
}

// 程序2-3 7744问题(2)
#include <stdio.h>
int main(void)
{
    int x, n, hi, lo;
    for(x = 1; ; x++){
        n = x * x;
        if(n < 1000)
            continue;
        if(n > 9999)
            break;
        hi = n / 100;
        lo = n % 100;
        if(hi/10==hi%10 && lo/10==lo%10)
            printf("%d\n", n);
    }
    return 0;
}

// 程序2-4 3n+1问题
#include <stdio.h>
int main(void)
{
    int n, count=0;
    scanf("%d", &n);
    while(n > 1)
    {
        if(n%2==1)
            n = n*3+1;
        else
            n /= 2;
        count++;
    }
    printf("%d\n", count);
    return 0;
}

// 程序2-5 阶乘之和(1)
#include <stdio.h>
int main(void)
{
    int i, n, fac, S;
    scanf("%d", &n);
    for(i = 1, fac = 1, S = 0; i <= n; i++){
        fac *= i;
        S += fac;
    }
    printf("%d\n", S%1000000);
    return 0;
}

// 程序2-6 阶乘之和(2)
#include <stdio.h>
#include <time.h>
int main(void)
{
    const int MOD = 1000000;
    int i, n, s, fac;
    scanf("%d", &n);
    if(n > 25) n = 25; // 通过实验得出规律
    for(i = 1, fac = 1, s = 0; i <= n; i++){
        fac = fac * i % MOD;
        s = (s + fac) % MOD;
    }
    printf("%d\n", s);
    printf("%.2f\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

// 程序2-8 数据统计(重定向版)
#define LOCAL
#include <stdio.h>
#define INF 100000000
int main(void)
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif // LOCAL
    int x, n = 0, s = 0, min = INF, max = -INF;
    while(scanf("%d", &x) == 1){
        s += x;
        if(x < min)
            min = x;
        if(x > max)
            max = x;
        // printf("x=%d, min=%d, max=%d\n", x, min, max);
        // “输出中间结果”调试
        n++;
    }
    printf("%d %d %.3f\n", min, max, (double)s/n);
    return 0;
}

// 程序2-9 数据统计(fopen版)
#include <stdio.h>
#define INF 100000000
int main(void)
{
    FILE *fin, *fout;
    fin = fopen("in.txt", "r");
    fout = fopen("out.txt", "w");
    int x, n = 0, s = 0, min = INF, max = -INF;
    while(fscanf(fin, "%d", &x) == 1){
        s += x;
        if(x < min)
            min = x;
        if(x > max)
            max = x;
        n++;
    }
    fprintf(fout, "%d %d %.3f\n", min, max, (double)s/n);
    fclose(fin);
    fclose(fout);
    return 0;
}

// C++重定向版
#include <fstream>
using namespace std;
ifstream fin("in.txt");
ofstream fout("out.txt");
int main(void)
{
	int a, b;
	while(fin >> a >> b)
		fout << a+b << endl;
	return 0;
}

// 习题2-1 位数(digit)
#include <stdio.h>
int main(void)
{
	int n, digit = 0;
	scanf("%d", &n);
	while(n){
		digit++;
		n /= 10;
	}
	printf("%d\n", digit);
	return 0;
}

// 习题2-2 水仙花数(daffodil)
#include <stdio.h>
int main(void)
{
	int x, y, z, i;
	for(i = 100; i <= 999; i++){
		x = i / 100;
		y = i / 10 % 10;
		z = i % 10;
		if (x*x*x + y*y*y + z*z*z == i)
			printf("%d\n", i);
	}
	return 0;
}

// 习题2-3 韩信点兵(hanxin)
#include <stdio.h>
int main(void)
{
	int a, b, c, i;
	scanf("%d%d%d", &a, &b, &c);
	for(i = 10; i <= 100; i++)    // 逆向思维
		if(i%3==a && i%5==b && i%7==c){
	 		printf("%d\n", i);
	 		break;
	 	}
	if(i == 101)
	 	printf("No answer\n");
	return 0;
}

// 习题2-4 倒三角形(triangle)
#include <stdio.h>
int main(void)
{
	int a, b, x, i;
	scanf("%d", &x);
	for(a = x; a >= 1; a--){
	 	for(i = 1; i <= 40-a; i++)
	  		printf(" ");
	 	for(b = 1; b <= 2*a-1; b++)
	  		printf("#");
	 	printf("\n");
	}
	return 0;
}

// 习题2-5 统计(stat)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    FILE *fin,*fout;
    fin=fopen("in.txt","rb");
    fout=fopen("out.txt","wb");
    int n,m;
    scanf("%d",&n);
    int *a=(int*)malloc(sizeof(int)*n);
    for(int i=0;i<n;i++)
        fscanf(fin,"%d",&a[i]);
    fscanf(fin,"%d",&m);
    int count=0;
    for(int i=0;i<n;i++)
        if(a[i]<m)
            count++;
    fprintf(fout,"%d",count);
    free(a);
    fclose(fin);
    fclose(fout);
    return 0;
}

// 习题2-6 调和级数(harmory)
#include <stdio.h>
int main(void)
{
	int n, i;
	double sum = 0;
	scanf("%d", &n);
	for(i = 1; i <= n; i++)
		sum += 1.0/i;
	printf("%.3f\n", sum);
	return 0;
}

// 习题2-7 近似计算(opproximation)
#include <stdio.h>
int main(void)
{
	int i = 1;
	double pi = 0, t = 1, x = 1;
	while (t >= 1e-6)
	{
	 	pi += x*t;
	 	i += 2;
	 	x = -x;
	 	t = 1.0 / i;
	}
	printf("%f\n", 4*pi);
	return 0;
}

// 习题2-8 子序列的和(subsequence)
#include <stdio.h>
int main(void)
{
    int n, m, i;
    double sum = 0;
    scanf("%d%d", &n, &m);
    for(i = n; i <= m; i++)
        sum += 1.0/i/i; // 不要写成sum += 1.0/(i*i),否则会溢出
    printf("%.5f\n", sum);
    return 0;
}

// 习题2-9 分数化小数(decimal)
#include <stdio.h>
int main(void)
{
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	printf("%.*f\n", c, 1.0*a/b);
	return 0;
}

// 习题2-10 排列(permutation)
#include <stdio.h>
int main(void)
{ // 直接“翻译”题目
    int a,b,c,d,e,f,g,h,i;
    for(a=1;a<=9;a++){
    for(b=1;b<=9;b++){
    for(c=1;c<=9;c++){
    for(d=1;d<=9;d++){
    for(e=1;e<=9;e++){
    for(f=1;f<=9;f++){
    for(g=1;g<=9;g++){
    for(h=1;h<=9;h++){
    for(i=1;i<=9;i++){
    if ((2*(a*100+b*10+c)==(d*100+e*10+f))&&(3*(a*100+b*10+c)==(g*100+h*10+i))&&
        (a!=b)&&(a!=c)&&(a!=d)&&(a!=e)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=i)&&(b!=c)&&
        (b!=d)&&(b!=e)&&(b!=f)&&(b!=g)&&(b!=h)&&(b!=i)&&(c!=d)&&(c!=e)&&(c!=f)&&
        (c!=g)&&(c!=h)&&(c!=i)&&(d!=e)&&(d!=f)&&(d!=g)&&(d!=h)&&(d!=i)&&(e!=f)&&
        (e!=g)&&(e!=h)&&(e!=i)&&(f!=g)&&(f!=h)&&(f!=i)&&(g!=h)&&(g!=i)&&(h!=i))
        printf("%d,%d,%d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);}}}}}}}}} 
    return 0;
}

转载于:https://www.cnblogs.com/yanweicode/p/4356296.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值