怎么做 一直都是错 老师总是说一半 郁闷
求4位数以内的相亲数对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。
2014-12-09 19:19

2014-12-09 19:22
2014-12-09 19:56
2014-12-09 20:27
程序代码:
#include <stdio.h>
#include <stdlib.h>
int sum(int n) {
int i, s = 0;
for(i = 1; i <= (n / 2); i++) {
if(0 == n % i) {
s += i;
}
}
return s;
}
int *pnum(int n) {
int i, j, *pn = NULL, *p = NULL;
pn = malloc(2 * n * sizeof(int));
p = pn;
if(p == NULL) {
printf("malloc error!\n");
exit(1);
}
for(i = 1, j = 1; i < 2 * n; j++, i += 2) {
*p = j;
p++;
*p = sum(j);
p++;
}
return pn;
}
int main(void) {
int N, i, j, *p = NULL;
printf("请输入一个正整数N,以查找相亲数对,数对中的每个数值均不大于N:");
scanf("%d", &N);
p = pnum(N);
for(i = 0 ; i < 2 * N; i += 2) {
for(j = 2; j < 2 * N; j += 2) {
if(*(p + i) == *(p + j + 1)
&& (*(p + i + 1) == *(p + j))
&& (*(p + i) < * (p + i + 1))) {
printf("%d\t%d\n", *(p + i), *(p + i + 1));
}
}
}
free(p);
return 0 ;
}

2014-12-09 22:11
2014-12-09 22:15
2014-12-10 10:12

2014-12-10 10:33
2014-12-10 10:42
程序代码:#include <stdio.h>
#include <stdlib.h>
int main( void )
{
//unsigned n;
//printf( "%s", "请输入一个正整数N,以查找相亲数对,数对中的每个数值均不大于N:" );
//if( scanf("%u",&n) != 1 )
// return 1;
unsigned n = 100000;
unsigned* p = malloc( sizeof(unsigned)*n );
if( !p )
return 2;
for( size_t i=0; i!=n; ++i )
{
p[i] = 1;
for( unsigned j=2; j*j<=(i+1); ++j )
if( (i+1)%j == 0 )
p[i] += j + (j*j==i+1?0:(i+1)/j);
}
for( size_t i=0; i!=n; ++i )
if( p[i]>i+1 && p[i]<=n && p[p[i]-1]==i+1 )
printf( "%u\t%u\n", i+1, p[i] );
free( p );
return 0;
}
2014-12-10 10:47