今晚在做一道题。。。然后,,用打素数表的方法找因子,后面各种bug。。。!!调了好久。。。发现是素数表设置的少了,又在用的时候作茧自缚的加了判断,,,high high的。。。。然后算是get下这个方法吧。。。
#include <stdio.h> #include <math.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int prime[510]; int vis[1000]; void findt() { int i,j,k; memset(prime,1,sizeof(prime)); for(i=2;i<=500;i++) { if(prime[i]) for(j=i+i;j<=500;j+=i) prime[j]=0; } } int main() { int n; findt(); while(1) { scanf("%d",&n); int i,j,k; int que[100]; int top=0; que[top++]=1; memset(vis,0,sizeof(vis)); for(i=2;i<=sqrt(n);i++) { //que[top++]=1; if(prime[i]&&(n%i)==0) { for(j=i;j<=sqrt(n);j+=i) if((n%j)==0&&!vis[j]) { vis[j]=1,vis[n/j]=1; if(j*j==n) que[top++]=j; else {que[top++]=j;que[top++]=n/j;} } } } sort(que,que+top); for(i=0;i<top;i++) printf("%d ",que[i]);printf("\n"); } return 0; }
嗯,,,然后言归正传,,要求一个数所有因子之和,我们可以-------
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<cmath> using namespace std; int num[1000000]; void deal() { for(int i = 2; i < 1000000; i++) num[i] = 1; for(int i = 2; i < 1000000; i++) for(int j = i * 2; j < 1000000; j += i) num[j] += i; for(int i=1000;i<=9999;i++) if(i==num[i]||abs(num[i]-i)<=3) printf("%d %d\n",i,num[i]); } int main() { //freopen("1001.in", "r", stdin); int l, r, bad, p; freopen("out.txt","w",stdout); p = 1; deal(); while(scanf("%d%d%d", &l, &r, &bad) && (l || r || bad)) { printf("Test %d: ", p++); int sum = 0; for(int i = l; i <= r; i++) if(abs(num[i] - i) <= bad) sum++; printf("%d\n", sum); } return 0; }