论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C趣味程序百例(14)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:49

45.将真分数分解为埃及分数
46.列出真分数序列
47.计算分数的精确值




45.将真分数分解为埃及分数
    分子为1 的分数称为埃及分数,现输入一个真分数,请将该分数分解为埃及分数。
    如:8/11=1/2+1/5+1/55+1/110。
*问题分析与算法设计
    若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为b/a+1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。
*程序与程序注释
#include<stdio.h>
void main()
{
    long int a,b,c;
    printf("Please enter a optional fraction(a/b):");
    scanf("%ld/%ld",&a,&b);           /*输入分子a和分母b*/
    printf("It can be decomposed to:");
    while(1)
    {
        if(b%a)              /*若分子不能整除分母*/
            c=b/a+1;         /*则分解出一个分母为b/a+1的埃及分数*/
        else{ c=b/a; a=1;}   /*否则,输出化简后的真分数(埃及分数)*/
        if(a==1)
        {
            printf("1/%ld\n",c);
            break;              /*a为1标志结束*/
        }
        else
            printf("1/%ld + ",c);
        a=a*c-b;               /*求出余数的分子*/
        b=b*c;                 /*求出余数的分母*/
        if(a==3)               /*若余数为3,输出最后两个埃及分数*/
        {    printf("1/%ld + 1/%ld\n",b/2,b);  break;}
    }
}
*运行结果
    1. Please enter a optional fraction (a/b): 1/6
        It can be decomposed to: 1/6
    2. Please enter a optional fraction (a/b): 20/33
        It can be decomposed to: 1/2+1/10+1/165
    3. Please enter a optional fraction (a/b): 10/89
        It can be decomposed to: 1/9+1/801
    4. Please enter a optional fraction (a/b): 19/99
        It can be decomposed to: 1/6+1/40+1/3960
    5. Please enter a optional fraction (a/b): 8/89
        It can be decomposed to: 1/11+1/957

46.列出真分数序列
    按递增顺序依次列出所有分母为40,分子小于40的最简分数。
*问题分析与算法设计
    对分子采用穷举法,利用最大公约数的方法,判定分子与40是否构成真分数。
*程序与程序注释
#include<stdio.h>
void main()
{
    int i,num1,num2,temp;
    printf("The fraction serials with demominator 40 is:\n");
    for(i=1;i<=40;i++)                     /*穷举40以内的全部分子*/
    {
        num1=40;
        num2=i;
        while(num2!=0)              /*采用辗转相除法求出最大公约数*/
        {
            temp=num1%num2;
            num1=num2;
            num2=temp;
        }
        if(num1==1)           /*若最大公约数为1,则为最简真分数*/
            printf("%d/40  ",i);
        
    }
}
*运行结果
    The fraction serials with demominator 40 is:
    1/40    3/40     7/40     9/40    11/40    13/40    17/40    19/40
   21/40    23/40    27/40    29/40    31/40    33/40    37/40    39/40

*思考题
    按递增顺序依次列出所有分母小于等于40的最简真分数

47.计算分数的精确值
    使用数组精确计算M/N(0<M<N<=100)的值。假如M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出 循环节的起止位置(小数位的序号)
*问题分析与算法设计
    由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,就必须自行设计实现方法。
    为了实现高精度的计算,可将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。这样就可以使用数组不表示一个高精度的计算结果。
    进行除法运算时可以模拟人的手工操作,即每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0 时,表示M/N为有限不循环小数某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的各位数就是小数的循环节。
    程序具体实现时,采用了数组和其它一些技巧来保存除法运算所得到的余数和商的各位数。
*程序与程序注释
#include<stdio.h>
int remainder[101],quotient[101];    /*remainder:存放除法的余数; quotient:依次存放商的每一位*/
void main()
{
    int m,n,i,j;
    printf("Please input a fraction(m/n)(<0<m<n<=100):");
    scanf("%d/%d",&m,&n);      /*输入被除数和除数*/
    printf("%d/%d it's accuracy value is:0.",m,n);
    for(i=1;i<=100;i++)             /*i: 商的位数*/
    {
        remainder[m]=i;       /*m:除的余数 remainder[m]:该余数对应的商的位数*/
        m*=10;                /*余数扩大10位*/
        quotient[i]=m/n;      /*商*/
        m=m%n;                /*求余数*/
        if(m==0)              /*余数为0 则表示是有限小数*/
        {
            for(j=1;j<=1;j++) printf("%d",quotient[j]);    /*输出商*/
            break;             /*退出循环*/
        }
        if(remainder[m]!=0)     /*若该余数对应的位在前面已经出现过*/
        {
           
for(j=1;j<=i;j++) printf("%d",quotient[j]);   /*则输出循环小数*/
            printf("\n\tand it is a infinite cyclic fraction from %d\n",remainder[m]);
            printf("\tdigit to %d digit after decimal point.\n",i);
                                              /*输出循环节的位置*/
            break;                /*退出*/
        }
    }
}
*运行结果



*思考题
    使用数组实现计算MXN的精确值

上一篇:{实例}C趣味编程百例(13) 人气:4977
下一篇:{实例}C趣味程序百例(15) 人气:6681
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程