日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1460 完数

發布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1460 完数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注意:num1和num2的大小未知,需比較!

有兩種方法:

法一:素數打印+素數分解(求因數和公式)

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int p[10005];//記錄包括自身的完數個數 9 bool vis[10005]; 10 int prime[1229+1];//如何估算比n小的素數的個數?? 提前打印即可,小于10000共1229個素數 11 void print_prime(){ 12 memset(vis,false,sizeof(vis)); 13 int i=2; 14 int index=0; 15 for(;i<10000;i++){ 16 if(!vis[i]){ 17 prime[index++]=i; 18 } 19 for(int j=0;j<index&&prime[j]*i<10000;j++){ 20 vis[prime[j]*i]=true; 21 if(i%prime[j]==0){ 22 break; 23 } 24 } 25 } 26 } 27 int work(int n){ 28 int i=0,ret=1,total=1,temp=n; 29 for(;prime[i]*prime[i]<=n;i++){ 30 int sum=1; 31 int num=1; 32 while(n%prime[i]==0){ 33 num*=prime[i]; 34 n/=prime[i]; 35 sum+=num; 36 } 37 total*=sum; 38 } 39 if(n>1){ 40 total*=n+1; 41 } 42 return total-temp; 43 } 44 void get_p(){ 45 memset(p,0,sizeof(p)); 46 p[2]=0; 47 p[3]=0; 48 int i=4; 49 for(;i<10000;i++){ 50 if(i==work(i)){ 51 p[i]=p[i-1]+1; 52 } 53 else{ 54 p[i]=p[i-1]; 55 } 56 } 57 } 58 int main()//10000 59 { 60 int n; 61 cin>>n; 62 print_prime(); 63 get_p(); 64 //cout<<p[6]<<endl; 65 while(n--){ 66 int num1,num2; 67 cin>>num1>>num2; 68 if(num1>num2){ 69 num1=num1+num2; 70 num2=num1-num2; 71 num1=num1-num2; 72 } 73 cout<<p[num2]-p[num1-1]<<endl; 74 } 75 return 0; 76 }

?

法二:篩法

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int main()//10000 9 { 10 int n; 11 cin>>n; 12 while(n--){ 13 int num1,num2; 14 cin>>num1>>num2; 15 if(num1>num2){ 16 num1=num1+num2; 17 num2=num1-num2; 18 num1=num1-num2; 19 } 20 int i=num1; 21 int num=0; 22 for(;i<=num2;i++){ 23 int j=2; 24 int sum=1; 25 for(;j<=i/2;j++){ 26 if(i%j==0){ 27 sum+=j; 28 } 29 } 30 if(sum==i){ 31 num++; 32 } 33 } 34 cout<<num<<endl; 35 } 36 return 0; 37 }

?

轉載于:https://www.cnblogs.com/Deribs4/p/4270508.html

總結

以上是生活随笔為你收集整理的hdu 1460 完数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。