MyException - 我的异常网
当前位置:我的异常网» 数据结构与算法 » 算法竞赛入门经典_第二章:循环结构程序设计_上机练

算法竞赛入门经典_第二章:循环结构程序设计_上机练习题_MyAnswer

www.MyException.Cn  网友分享于:2014-12-12  浏览:0次
算法竞赛入门经典_第二章:循环结构程序设计_上机练习_MyAnswer

习题2-1 位数

输入一个不超过109的正整数,输出它的位数。例如12735的位数是5。请不要使用任何数学函数,只用四则运算和循环语句实现。

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

习题2-2 水仙花数

输出100~999中的所有水仙花数。若3位数ABC满足ABC = A3 + B3 + C3,则称其为水仙花数。例如153 = 13 + 53 + 33,所以153是水仙花数。

#include<stdio.h>
int main(void)
{
    int a, b, c, i;
    
    for(i = 100; i < 1000; i++)
    {
        a = i / 100;
        b = i / 10 - a * 10;
        c = i % 10;
        if(i == a*a*a + b*b*b + c*c*c)
            printf("%d\n", i);        
    }
    
    return 0;
}
// 输出结果: 153 370 371 407

习题2-3 韩信点兵

相信韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c,表示每种队形排尾的人数(a < 3,b < 5,c < 7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。

样例输入:2 1 6  样例输出:41

样例输入:2 1 3  样例输出:No answer

#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", i);
            break;
        }
    }

    if(i == 101)
        printf("No answer\n");
    return 0;
}

习题2-4 倒三角形

输入正整数n ≤ 20,输出一个n层的倒三角形。例如n = 5时输出如下:

#########

 #######

  #####

   ###

    #

#include<stdio.h> // 找规律题
int main(void)
{
    int n, i, j;
    scanf("%d", &n);

    for(i = 0; i < n; i++)
    {
        for(j = i; j > 0; j--)
            printf(" ");
        for(j = 1; j <= 2*(n-i)-1; j++)
            printf("#");
        
        printf("\n");
    }
    
    return 0;
}

习题2-5 统计

输入一个正整数n,然后读取n个正整数a1,a2,...,an,最后再读一个正整数m。统计a1,a2,...,an,中有多少个整数的值小于m。提示:如果重定向和fopen都可以使用,哪个比较方便?

#include<stdio.h>
int main(void)
{
    // 没有采用重定向的方式,因为用这种方式,我不知道如何二次打开一个文件。
    // freopen("E:/desktop/input.txt", "r", stdin);
    // freopen("E:/desktop/output.txt", "w", stdout);
    
    FILE * fin;
    FILE * fout;
    
    fin = fopen("E:/desktop/input.txt", "rb"); // 存放在桌面上
    fout = fopen("E:/desktop/output.txt", "wb");
    
    int n, number, m;
    int count = 0;
    fscanf(fin, "%d", &n);
    
    while(n--)
    {
        fscanf(fin, "%d", &number);
    }
    
    fscanf(fin, "%d", &m);
    
    rewind(fin); // 文件指针重新指向文件开头
    
    fscanf(fin, "%d", &n);
    while(n--)
    {
        fscanf(fin, "%d", &number);
        if(number < m)
            count++;
    }

    fprintf(fout, "%d\n", count);
    
    fclose(fin);
    fclose(fout);
    return 0;
}

习题2-6 调和级数

输入正整数n,输出H(n) = 1 + 1/2 + 1/3 + ... + 1/n 的值,保留3位小数。例如 n = 3时答案为1.833。

#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("%.3lf\n", sum);
    
    return 0;
}

习题2-7 近似计算

计算π/4 = 1 - 1/3 + 1/5 - 1/7 +...,直到最后一项小于10-6

#include<stdio.h>
#include<math.h>
int main(void)
{
    int n = 1; 
    double sum = 0;
    
    while(1)
    {    
        sum += 1.0 / n;
        n = n > 0 ? n+2 : n-2;
        n = -n;
        if(fabs(1.0/n) < 1E-6)
        {
            break;
        }
    }
    
    printf("%lf\n", sum);
    return 0;
}

习题2-8 子序列的和

输入两个正整数 n < m < 106,输出 1/n2 + 1/(n+1)2 +...+ 1/m2,保留5位小数。例如 n = 2,m = 4时答案是0.42361;n = 65536,m = 655360时答案为0.00001。注意:本题有陷阱。

#include<stdio.h>
int main(void)
{
    int m, n, i;
    double sum = 0;
    
    scanf("%d%d", &n, &m);
    for(i = n; i <= m; i++)
    {
        // 两种方式皆可防止整形溢出
        // sum += 1.0 /( (long long int)i*i);
        
        sum += 1.0 / i / i;
    }
    
    printf("%.5lf\n", sum);
    
    return 0;
}

习题2-9 分数化小数

输入正整数a,b,c,输出 a / b 的小数形式,精确到小数点后c位。a,b ≤ 106,,c ≤ 100。例如 a = 1,b = 6,c = 4时应该输出0.1667。

#include<stdio.h>
double roundNum(double, int); // 该函数用于实现四舍五入
#include<math.h>
int main(void)
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    
    double value = 1.0 * a / b;
    double frac;

    printf("%d.", (int)value); // 这里必须强制类型转换
    frac = value - (int)value; // 得到小数部分
    frac = roundNum(frac, c);
    
    while(c--)
    {
        frac *= 10;
        printf("%d", (int)frac);
        frac = frac - (int)frac;
    }
    
    return 0;
}

double roundNum(double frac, int c)
{
    int i;
    double temp = 0.5;
    
    while(c--)
        temp /= 10;
    
    return temp+frac;
}

有趣的是前几天看《数据结构与算法:C语言描述》时遇到过极相似的问题,特别记录在了这里

习题2-10 排列

用1,2,3,...,9组成3个三位数 abc,def 和 ghi,每个数字恰好使用一次,要求 abc :def:ghi = 1:2:3。输出所有的解。提示:不必太动脑筋。

 

#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++)
            if(a!=b)
                for(c = 1; c <= 9; c++)
                    if(c!=a && c!=b)
                        for(d = 1; d <= 9; d++)
                            if(d!=a && d!=b && d!= c)
                                for(e = 1; e <= 9;e++)
                                    if(e!=a && e!=b && e!=c && e!=d)
                                        for(f = 1; f <= 9; f++)
                                            if(f!=a && f!=b && f!=c && f!=d && f!=e)
                                                for(g = 1; g <= 9; g++)
                                                    if(g!=a && g!=b && g!=c && g!=d && g!=e && g!=f)
                                                        for(h = 1; h <= 9; h++)
                                                            if(h!=a && h!=b && h!=c && h!=d && h!=e && h!=f && h!=g)
                                                                for(i = 1; i <= 9; i++)
                                                                    if(i!=a && i!=b && i!=c && i!=d && i!=e && i!=f && i!=g && i!=h)
                                                                    {
                                                                        int n1 = a*100 + b*10 + c;
                                                                        int n2 = d*100 + e*10 + f;
                                                                        int n3 = g*100 + h*10 + i;
                                                                        
                                                                        if(n1*2== n2 && n1*3==n3)
                                                                            printf("%d %d %d\n", n1, n2, n3);
                                                                    }                
    return 0;
}

/*
数出结果:
192 384 576 219 438 657 273 546 819 327 654 981
*/
All Rights Reserved.
Author:海峰:)
Copyright © xp_jiang. 
转载请标明出处:http://www.cnblogs.com/xpjiang/p/4156314.html

文章评论

程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员必看的十大电影
程序员必看的十大电影
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
每天工作4小时的程序员
每天工作4小时的程序员
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
编程语言是女人
编程语言是女人
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个调试和排错的小建议
10个调试和排错的小建议
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员都该阅读的书
程序员都该阅读的书
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
那些争议最大的编程观点
那些争议最大的编程观点
程序员的鄙视链
程序员的鄙视链
 程序员的样子
程序员的样子
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员和编码员之间的区别
程序员和编码员之间的区别
总结2014中国互联网十大段子
总结2014中国互联网十大段子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
我是如何打败拖延症的
我是如何打败拖延症的
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
代码女神横空出世
代码女神横空出世
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
漫画:程序员的工作
漫画:程序员的工作
Java程序员必看电影
Java程序员必看电影
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
旅行,写作,编程
旅行,写作,编程
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有