怎么做 一直都是错 老师总是说一半 郁闷
求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。
#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 ; }
#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; }