注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

记录创意的火花

天天学习,好好向上

 
 
 

日志

 
 

互满数的求解方法  

2009-09-13 12:52:43|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

互满数

    有一些成对的数具有相当奇妙的关联性,也就是其中一个数的因数和会等于另一个数。因这种两数之间存在“互利共生”的现象,数学家将它们命名为互满数(amicable pairs)。

    最小的一对互满数为220与284.

    220:1+2+4+5+10+11+20+22+44+55+110=284

    284:1+2+4+71+142=220

    欧拉在研究过这种数之后,在1750年给出了60对互满数。但令人惊讶的是,他漏掉了第二小的一对,即1 184与1 210.直到1866年,才由一位16岁少年帕格尼尼(Paganini)发现了它们。试找出1 184与1 210的因数,并检验其密切的关联性。

    其他可供你研究的互满数有:

互满数的求解方法 - good idea! - 记录创意的火花

1000以内的互满数程序

解法一(个人参考完全数程序写的):#include <stdio.h>
#include <stdlib.h>

#define N 1000
#define P 10000

int prime(int*);  // 求質數表
int factor(int*, int, int*);  // 求factor
int fsum(int*, int);  // sum ot proper factor

int main(void) {
    int ptable[N+1] = {0}; // 儲存質數表
    int fact[N+1] = {0};   // 儲存分解結果
    int count1, count2, i;
 int a,b;

    count1 = prime(ptable);

    for(i = 0; i <= P; i++) {
        count2 = factor(ptable, i, fact);
      a= fsum(fact, count2)-i;
     count2 = factor(ptable, a, fact);
       b= fsum(fact, count2)-a;
    if(i==b&&i!=a)
            printf("humanshu  a,b: %d,%d\n", i,a);
    }
   
    printf("\n");

    return 0;
}

int prime(int* pNum) {
    int i, j;
    int prime[N+1];

    for(i = 2; i <= N; i++)
        prime[i] = 1;

    for(i = 2; i*i <= N; i++) {
        if(prime[i] == 1) {
            for(j = 2*i; j <= N; j++) {
                if(j % i == 0)
                    prime[j] = 0;
            }
        }
    }

    for(i = 2, j = 0; i < N; i++) {
        if(prime[i] == 1)
            pNum[j++] = i;
    }

    return j;
}

int factor(int* table, int num, int* frecord) {
    int i, k;

    for(i = 0, k = 0; table[i] * table[i] <= num;) {
        if(num % table[i] == 0) {
            frecord[k] = table[i];
            k++;
            num /= table[i];
        }
        else
            i++;
    }

 frecord[k] = num;

    return k+1;

}

int fsum(int* farr, int c) {
    int i, r, s, q;

    i = 0;
    r = 1;
    s = 1;
    q = 1;

    while(i < c) {
        do {
            r *= farr[i];
            q += r;
            i++;
        } while(farr[i-1] == farr[i] && i - 1 < c);
        s *= q;
        r = 1;
        q = 1;
    }


 return s;
}

解法二网友(yansheng)编写1000之内互满数:

#include<stdio.h>
int humanshu(int m,int n)
{
    int i,s1=0,s2=0;
   
    for(i=1;i<m;i++)
        if(m%i==0)
            s1+=i;

    for(i=1;i<n;i++)
        if(n%i==0)
            s2+=i;
   
    if(s1==n&&s2==m)
        return 1;
    return 0;
}
int fun(int m,int n,int a[][2])
{
    int i,j,k=0;
    for(i=m;i<n;i++)
    {
        for(j=i+1;j<=n;j++)
            if(humanshu(i,j))
            {
                printf("In fun():%d,%d\n",i,j );
                a[k][0]=i;
                a[k++][1]=j;
            }
    }
    return k;
}
int main()
{
    int m=200,n=1000,g,a[10][2],i;
    g=fun(m,n,a);
    for(i=0;i<g;i++)
        printf("%d,%d\n",a[i][0],a[i][1]);
}
当然了还行不知道什么原因出不来结果的:

#include<stdio.h>
int humanshu(int m,int n)
{
    int i,s1=0,s2=0;
    for(i=1;i<m;i++)
        if(m%i==0)
            s1+=i;
        for(i=1;i<n;i++)
            if(n%i==0)
                s2+=i;
            if(s1==n&&s2==m)
                return 1;
            return 0;
}
int fun(int m,int n,int a[][2])
{
    int i,j,k=0;
    for(i=m;i<n;i++)
        for(j=i+1;j<=n;j++)
            if(humanshu(i,j))
            {
                a[k][0]=i;
                a[k++][1]=j;
            }
            return k;
}
void main()
{
    int m=200,n=10000,g,a[10][2],i;
    g=fun(m,n,a);
    for(i=0;i<g;i++)
    printf("%d,%d\n",a[i][0],a[i][1]);
}

http://gc063tzf.blog.163.com
  评论这张
 
阅读(891)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017