标题:《C语言经典算法 100 例》习题探讨
只看楼主
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
结帖率:46.15%
 问题点数:0 回复次数:24 
《C语言经典算法 100 例》习题探讨
/*
  Name: C语言经典算法100例001
  Copyright: *
  Author: 巧若拙
  Date: 24-08-14 14:31
  Description:
  题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?  
*/

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    int i, j, k;
    int count = 0;
   
    for (i=1; i<=4; i++)
    {
        for (j=1; j<=4; j++)
        {
            for (k=1; k<=4; k++)
            {
                if (j != i && k != i && k != j)
                {
                    printf("%d %d %d\t", i, j, k);
                    count++;
                }
            }
        }
    }
   
    printf("\n总共有 %d 组数字\n", count);
   
    system("pause");
    return 0;
}
-----------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------
搜索更多相关主题的帖子: C语言 include Copyright count 经典 
2014-08-24 22:30
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
得分:0 
/*
  Name: C语言经典算法100例002
  Copyright: **
  Author: 巧若拙
  Date: 24-08-14 14:52
  Description:
  题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?            
*/

/*算法分析:
    分别把利润节点和对应提成比率存储到2个数组中,本题目中共有6个利润节点(其中利润为0算作第一个节点),
profit[i]~profit[i+1]阶段的提成率为reward[i]。
    fun1()从最大的利润节点开始遍历整个数组,找到“有效”的利润节点,先算出超出该节点部分的奖金,再计算该利润节点对应的奖金。
把所有奖金累积起来。
    fun2()反其道而行,先计算利润节点之内的奖金,再加上超出部分奖金。相对来说fun2()较好理解,用时较短。
*/

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define MAX 6

void fun1(void);
void fun2(void);

int main(void)
{
    fun1();
    fun2();
   
    system("pause");
    return 0;
}

void fun1(void)
{
    float profit[MAX]={0, 10, 20, 40, 60, 100};
    float reward[MAX]={0.1, 0.075, 0.05, 0.03, 0.015, 0.01};
    float pro = 0, rew = 0;
    int i;
   
    puts("请输入当月利润:");
    scanf("%f", &pro); printf("\nlirun: %f\n", pro);
   
    for (i=MAX-1; i>=0; i--)
    {
        if (pro > profit[i]) //寻找“有效”的利润节点,即利润必须大于该利润节点
        {
            rew += (pro - profit[i]) * reward[i]; //先计算超出部分奖金
            pro = profit[i]; //再计算剩余部分奖金,恰好等于某个利润节点
        }
    }
   
    printf("\n提成为: %f\n", rew);
}

void fun2(void)
{
    float profit[MAX]={0, 10, 20, 40, 60, 100};
    float reward[MAX]={0.1, 0.075, 0.05, 0.03, 0.015, 0.01};
    float pro = 0, rew = 0;
    int i = 0;
   
    puts("请输入当月利润:");
    scanf("%f", &pro); printf("\nlirun: %f\n", pro);
   
    while ((i < MAX-1) &&  pro > profit[i+1])//先计算利润节点之内的奖金
    {
        rew += (profit[i+1] - profit[i]) * reward[i];
        i++;
    }

    rew += (pro - profit[i]) * reward[i]; //再加上超出部分奖金
           
    printf("\n提成为: %f\n", rew);
}
-----------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------
2014-08-24 22:32
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
得分:0 
/*
  Name: C语言经典算法100例003
  Copyright: *
  Author: 巧若拙
  Date: 24-08-14 21:38
  Description:
  题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define NUM1 100
#define NUM2 168

int main(void)
{
    int n = 0;
    int num1, num2;

    while (1)
    {
         n++;
         num1 = (int)sqrt(n+NUM1);
         num2 = (int)sqrt(n+NUM1+NUM2);
         if ((n+NUM1 == num1*num1) && (n+NUM1+NUM2 == num2*num2))
             break;
    }
   
    printf("这个数就是:%d\n", n);
   
    system("pause");
    return 0;
}
-----------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------
2014-08-24 22:35
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
前面两个没看,第三个估计有点问题,呵呵

梦想拥有一台龙芯3A-4000
2014-08-24 23:28
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
稍微改一下题目:

一个整数,它加上9后是一个完全平方数,再加上7又是一个完全平方数,请问该数是多少?

梦想拥有一台龙芯3A-4000
2014-08-24 23:30
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
得分:0 
只需修改NUM1和NUM2的值。
你出的题目有解吗?
2014-08-25 08:45
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
得分:0 
/*
  Name: C语言经典算法100例004
  Copyright: *
  Author: 巧若拙
  Date: 25-08-14 07:08
  Description:
  题目:输入某年某月某日,判断这一天是这一年的第几天?     
   (year能被4整除 and 不能被100整除) or year能被400整除        
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>

void fun1(void);
int LeapYear(int year);

int main(void)
{
    fun1();
   
    system("pause");
    return 0;
}

int LeapYear(int year)//判断是否为闰年
{
    if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
        return 1;
    else
        return 0;
}

void fun1(void)
{
    int MonthLib[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int year, month, day;
    int i, count = 0;
   
    puts("请输入日期(年月日用空格隔开):");
    scanf("%d %d %d", &year, &month, &day);
   
    if (LeapYear(year)) //如果是闰年,2月为29天
        MonthLib[1] = 29;
   
    count = day;
    for (i=0; i<month-1; i++)
        count += MonthLib[i];
   
    printf("\n这天是该年的第 %d 天\n", count);
}
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
2014-08-25 08:46
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
得分:0 
/*
  Name: C语言经典算法100例005
  Copyright: *
  Author: 巧若拙
  Date: 25-08-14 08:02
  Description:
  题目:输入三个整数x,y,z,请把这三个数由小到大输出。
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>

void fun1(void);

int main(void)
{
    fun1();
   
    system("pause");
    return 0;
}

void fun1(void)
{
    int x, y, z, t;
   
    puts("请输入三个整数(用空格隔开):");
    scanf("%d %d %d", &x, &y, &z);
   
    if (x > y)
    {
        t = x;
        x = y;
        y = t;
    }
    if (x > z)
    {
        t = x;
        x = z;
        z = t;
    }
    if (y > z)
    {
        t = y;
        y = z;
        z = t;
    }
   
    printf("\n%d %d %d", x, y, z);
}
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
2014-08-25 08:47
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
得分:0 
/*
  Name: C语言经典算法100例006
  Copyright: *
  Author: 巧若拙  
  Date: 25-08-14 08:20
  Description:
  题目:用*号输出字母C的图案。
*/
#include<stdio.h>
#include<stdlib.h>

void fun1(void);

int main(void)
{
    fun1();
   
    system("pause");
    return 0;
}

void fun1(void)
{
   puts("****");
   puts("*");
   puts("*");
   puts("****");
}
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
2014-08-25 08:47
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
就你解题中的边界n = 0呀,负整数的还没碰呢,呵呵

梦想拥有一台龙芯3A-4000
2014-08-25 11:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-435320-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.108182 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved