Almost-perfect Number

View as PDF

Submit solution

Points: 1
Time limit: 2.0s
Memory limit: 512M
C99 512K

Author:
Problem type
Allowed languages
ADA, Brainf*ck, C, C#, C++, clang, clang++, Cobol, Fortran, Haskell, Java, Java 11, JAVA 8, LUA, Pascal, PHP, text, ZIG

Problem Description

一個正整數N的真因數是那些小於N的因數,例如6的真因數有1,2,31,2,3。如果N的真因數總和恰好等於NN,則稱NN是perfect number,例如6=1+2+36=1+2+3。輸入兩數ppqq,計算在ppqq之間的數字中,哪一個數字N的真因數總和不超過N而與N的差值最小,如果最小差值的數字不只一個,則輸出其中最小的那一個。

Input Format

第一行是測資筆數TTT<=8T<=8。每筆測資一行,包含兩個正整數p與q,其中p,q都大於1且不超過1,000,000。

Output Format

每筆測資輸出一行,先輸出最小差值,再輸出滿足最小差值中最小的數字NN

例如: p=6p=6, q=8q=8,則:

6-(1+2+3)=0
7-(1)=6
8-(1+2+4)=1

因此輸出0066。 又例如: p=12p=12 q=8q=8,則:

8-(1+2+4)=1, 
9-(1+3)=5, 
10-(1+2+5)=2, 
11-(1)=10, 
12<(1+2+3+4+6),

因此輸出1188

Sample Input

2
6 8
12 8

Sample Output

0 6
1 8

Comments


  • 0
    jordan123789456  commented on Jan. 4, 2021, 11:41 p.m.

    include<stdio.h>

    void solution(int,int);

    int main() { int n1,n2; scanf("%d%d",&n1,&n2); solution(n1,n2); return 0; } void solution(int n1,int n2) { int temp1,temp2,min,minfirst,ans; if(n1 > n2)//確保n1<=n2,使用temp1 { temp1 = n1; n1 = n2; n2 = temp1; } for(int i = n1;i <= n2;i++)//n1~n2計算 { for(int j = 1;j < i;j++)//因數統整,使用temp2 { if(i % j ==0) temp2 = temp2 + j; } if((min>(i-temp2)&&(i-temp2)>0) || minfirst==0)//minfirst為min第一次不條件通過 { min = i-temp2;//改變min ans = i;//改變min所屬的n1 } temp2 = 0;//temp2迴圈後歸零 minfirst = 1; } printf("%d %d",min,ans); }


  • 0
    jordan123789456  commented on Jan. 4, 2021, 11:29 p.m.

    include<stdio.h>

    int main() {

    int n1,n2,temp1,temp2,min,minfirst,ans;
    scanf("%d%d",&n1,&n2);
    if(n1 > n2)//確保n1<=n2,使用temp1 
    {
        temp1 = n1;
        n1 = n2;
        n2 = temp1;
    }
    for(int n1 = n1;n1 <= n2;n1++)//n1~n2計算 
    {
        for(int j = 1;j < n1;j++)//因數統整,使用temp2 
        {
            if(n1 % j ==0)
                temp2 = temp2 + j;
        }
        if((min>(n1-temp2)&&(n1-temp2)>0) || minfirst==0)//minfirst為min第一次不條件通過 
        {
            min = n1-temp2;//改變min 
            ans = n1;//改變min所屬的n1 
        }
        temp2 = 0;//temp2迴圈後歸零
        minfirst = 1;
    }
    printf("%d %d",min,ans);
    return 0;

    }