summaryrefslogtreecommitdiff
path: root/euler21.c
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-05-24 21:39:58 +0800
committerIru Cai <mytbk920423@gmail.com>2018-05-24 21:39:58 +0800
commit1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db (patch)
treeabde0e4da3c7fe138f3874a94d8eb7d0e44c3224 /euler21.c
downloadproject_euler-1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db.tar.xz
initial commit
Diffstat (limited to 'euler21.c')
-rw-r--r--euler21.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/euler21.c b/euler21.c
new file mode 100644
index 0000000..d18e556
--- /dev/null
+++ b/euler21.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <math.h>
+#define MAX 9999
+
+int firstdiv(int n)
+{
+ int i;
+ int q=ceil(sqrt(n));
+ for (i=2;i<=q;++i){
+ if (n%i==0)
+ return i;
+ }
+ return n;
+}
+
+int divexp(int n,int d)
+{
+ int dd=1;
+ while (n%d==0){
+ n/=d;
+ dd*=d;
+ }
+ return dd;
+}
+
+int sumdiv(int n)
+{
+ if (n==1)
+ return 1;
+
+ int fd=firstdiv(n);
+ int fdexp=divexp(n,fd);
+ return sumdiv(n/fdexp)*(fdexp*fd-1)/(fd-1);
+}
+
+int main()
+{
+ int d[MAX+1],i,sum=0;
+ for (i=1;i<=MAX;++i){
+ d[i]=sumdiv(i)-i;
+ }
+ for (i=1;i<=MAX;++i){
+ if (i<d[i] && d[i]<=MAX && i==d[d[i]]){
+ sum+=i+d[i];
+ }else if (d[i]>MAX && sumdiv(d[i])-d[i]==i){
+ sum+=i;
+ }
+ }
+ printf("%d\n",sum);
+ return 0;
+}
+