论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: 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趣味程序(二)(12)

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



2.6 相亲数
   
2500年前数学大师毕哥达拉斯就发现,220与284两数之间存在着微妙的联系:
    220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
    284的真因数之和为:1+2+4+71+142=220
    毕达哥拉斯把这样的数对A,B称为相亲数:A的真因数之和为B,而B的真因数之和为A。
    相亲数的直接推广是相亲数链:呈连环套形式的多个相亲数。例如,A的真因数之和为B,B的真因数之和为C,C的真因数之和为D,最后D的真因数之和又为A,则A,B,C,D称为一个4环相亲数链。
    数学界寻找相亲数与相亲数链,竟相打破最大相亲数记录的热情不减。

2.6.1 求4位以内的相亲数
    1.算法分析
    对指定区间中的每一个整数i应用试商实施穷举判别。根据相亲数的定义,用试商法(i mod j=0)找出i的所有小于i的真因数j,并求出真因数的和s。然后用同样的方法找出整数s的真因数之和s1。假如有s1=i,则i,s为相亲数对。
    为减少试商j循环次数,注重到数i若为非平方数,它的大于1小于i的因数成对出现,一对中的较小因数要小于i的平方根。若数i愉为整数t的平方,此时t为i的一个因数,而不是一对,因而在和s中减去多加的因数t,这样试商j循环只要从2取到i的平方根t=SQR(i),可大减少j循环次数。缩减程序的运行时间。最后按规格打印所找出相亲数。
程序代码如下:
/*求4位以内的相亲数*/
#include<stdio.h>
#include<math.h>
void main()
{
    int i,j,s,t,s1;
    for(i=11;i<=9999;i++)
    {
        s=1;t=sqrt(i);
        for(j=2;j<=t;j++) if(i%j==0) s=s+j+i/j;
        if(i==t*t)s-=t;        /*求i的真因数之和s*/
        if(i<s)                /*规定i<s,避免重复*/
        {
            s1=1;t=sqrt(s);
            for(j=2;j<=t;j++) if(s%j==0) s1=s1+j+s/j;
            if(s==t*t) s1-=t;        /*求s的真因数之和s1*/
            if(s1==i)
            {
                printf("相亲数:%d,%d\n",i,s);
                printf("%d的真因数之和为:1",i);    /*规格打印相亲数*/
                for(j=2;j<=i/2;j++) if(i%j==0) printf("+%d",j);
                printf("=%d\n",s);
                printf("%d的真因数之和为:%d",s,1);
                for(j=2;j<=s/2;j++) if(s%j==0) printf("+%d",j);
                printf("=%d\n",i);
            }
        }
    }
}

程序运行结果如下:


2.6.2 求n环相亲数链
    1.算法分析
    在相亲数的基础上,根据指定的n求n环相亲数链,设置数组s:s(0)即为循环中选取的整数i(预置范围是11~2000000),其真因数之和存储到s(1)。一般地,通过k循环实现把s(i-1)的真因数之和存储到 s(i)(k:1-n)。
    判别:若s(n)<>s(0),则测试下一个i,直至s(n)==s(0)时,找到相亲数链的n个环数。按规格作打印输出。
程序代码如下:
/*求n环相亲数链*/
程序运行结果如下:
#include<stdio.h>
#include<math.h>
void main()
{
    int c,k,n;
    long i,j,t,s[100];
    printf("\n 寻求n环相亲数链。请输入n: ");
    scanf("%d",&n);
    for(i=11;i<=2000000;i++)
    {
        s[0]=i;
        for(c=0,k=1;k<=n;k++)
        {
            s[k]=1;t=sqrt(s[k-1]);
            for(j=2;j<=t;j++) if(s[k-1]%j==0) s[k]=s[k]+j+s[k-1]/j;
            if(s[k-1]==t*t)s[k]-=t;
            for(j=0;j<=k-1;j++) if(s[k]==s[j]){c=1;break;}
            if(c==1) break;}
            if(s[0]==s[n])
            {
                printf("\n %d 环相亲数链:\n",n);
                for(k=0;k<=n-1;k++)
                {
                    printf("\n%ld: %d",s[k],1);
                    for(j=2;j<=s[k]/2;j++)
                        if(s[k]%j==0)printf("+%d",j);
                    printf("=%ld",s[k+1]);}
                    break;}
   
     }
        printf("\n");
}

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程