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

来源:互联网 发布:留学低龄化数据 编辑:程序博客网 时间:2024/04/30 15:36
// 程序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 100000000int 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 100000000int 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;}

0 0
原创粉丝点击