Buddy pairs

kata programming

مساله:

می دانید که تقسیم کننده های یک عدد چیست. تقسیم کننده های یک عدد صحیح n زمانی مناسب هستند که به جز n مابقی مقسوم علیه های آن باشند. در ادامه توضیحات، مقسوم علیه ها به معنی تقسیم کننده های مناسب معرفی شده اند. برای مثال برای عدد 100 ما اعداد 1 ، 2 ، 4 ، 5 ، 10 ، 20 ، 25 و 50 را داریم.

اجازه دهید s (n) مجموع این تقسیم کننده های مناسب n باشد. دوست دو عدد صحیح مثبت را فراخوانی کنید به طوری که مجموع تقسیم کننده های مناسب هر عدد یک عدد بیشتر از عدد دیگر باشد:

(n ، m) یک جفت دوست هستند اگر s (m) = n + 1 و s (n) = m + 1

به عنوان مثال 48 و 75 چنین جفتی است:

مقسوم علیه های 48 عبارتند از: 1 ، 2 ، 3 ، 4 ، 6 ، 8 ، 12 ، 16 ، 24 -> مجموع: 76 = 75 + 1

مقسوم علیه های 75 عبارتند از: 1 ، 3 ، 5 ، 15 ، 25 -> مجموع: 49 = 48 + 1

وظیفه:

دو عدد صحیح شروع و محدودیت به شما داده می شود، تابع رفیق (شروع ، محدودیت) باید جفت اول (n m) از جفت های رفیق را برگرداند به طوری که n (عدد صحیح مثبت) بین شروع (شامل) و حد (شامل) باشد. m می تواند بیشتر از محدودیت باشد و باید بزرگتر از n باشد.

اگر هیچ جفت رفیقی که شرایط را برآورده کند وجود ندارد، عبارت “Nothing” یا (برای زبان Go) nil یا (برای Dart) null را برگردانید. (برای Lua ، Pascal ، Perl) [1 ، -1-].

مثال ها:

(بسته به زبانها)

buddy(10, 50) returns [48, 75] 
buddy(48, 50) returns [48, 75]
or
buddy(10, 50) returns "(48 75)"
buddy(48, 50) returns "(48 75)"

You know what divisors of a number are. The divisors of a positive integer n are said to be proper when you consider only the divisors other than n itself. In the following description, divisors will mean proper divisors. For example for 100 they are 1, 2, 4, 5, 10, 20, 25, and 50.

Let s(n) be the sum of these proper divisors of n. Call buddy two positive integers such that the sum of the proper divisors of each number is one more than the other number:

(n, m) are a pair of buddy if s(m) = n + 1 and s(n) = m + 1

For example 48 & 75 is such a pair:

Divisors of 48 are: 1, 2, 3, 4, 6, 8, 12, 16, 24 –> sum: 76 = 75 + 1

Divisors of 75 are: 1, 3, 5, 15, 25 –> sum: 49 = 48 + 1

Task

Given two positive integers start and limit, the function buddy(start, limit) should return the first pair (n m) of buddy pairs such that n (positive integer) is between start (inclusive) and limit (inclusive); m can be greater than limit and has to be greater than n

If there is no buddy pair satisfying the conditions, then return "Nothing" or (for Go lang) nil or (for Dartnull; (for LuaPascalPerl[-1, -1].

Examples

(depending on the languages)

buddy(10, 50) returns [48, 75] 
buddy(48, 50) returns [48, 75]
or
buddy(10, 50) returns "(48 75)"
buddy(48, 50) returns "(48 75)"

Notes

for C: The returned string will be free’d.

See more examples in “Sample Tests:” of your language.


class Bud {
    public static String buddy(long start, long limit) {
      long A;
      long B;

        for (long i = start; i <= limit; i++) {
          A = i;
          B = divSum(i) - 1;
          if ((A + 1 == divSum(B)) & (B > A)) return ("(" + A + " " + B + ")");
        }
        
        return "Nothing";
    }
    
    public static long divSum(long A) {
        long divSum = 0;
        for (long i = 2; i <= Math.sqrt(A); i++) {
            if (A % i == 0) {
                divSum = divSum + i + A / i;
            }
            if (i * i == A) divSum = divSum - i;
        }
        divSum++;
        return divSum;
    }
}
class Bud {
    private static long nbd(long n) {
        long sum = 1;
        for(long i = 2; i <= (long)Math.sqrt(n); i++) {
            if (n % i == 0) {
               sum += i;
               long d = n / i;
               if (d != i) sum += d;
            }
        }
        return sum;
    }
    public static String buddy(long start, long limit) {
        for ( long n = start; n <= limit; n++ ) {
            long m = nbd(n)-1;
          if ( n == nbd(m)-1 && n < m ) return "(" + Long.toString(n) + " " + Long.toString(m) + ")";
        }
        return "Nothing";
    }
}
class Bud {
    public static String buddy(long start, long limit) {
        while (start <= limit){
            long pair = sumDivisor(start);
            if ((sumDivisor(pair)==start)&&(pair>start))
                return String.format("(%d %d)", start, pair);
            start++;
        }
        return "Nothing";
    }
    
    private static long sumDivisor(long num){
        long sum = 0;
        for (long i = 2; i <= Math.sqrt(num); i++)
            if (num%i==0) sum += i+num/i;
        return sum;
    }
    
}
import java.util.stream.LongStream;
class Bud {
    public static String buddy(long start, long limit) {
        for (long n = start; n <= limit; n++ ) {
            long m = sum(n)-1;
            if ( n == sum(m)-1 && n < m ) return "(" + Long.toString(n) + " " + Long.toString(m) + ")";
        }
        return "Nothing";
    }

    public static long sum(long n) {
        long sum = 1;
        for (long i = 2; i <= (long) Math.sqrt(n); i++) {
            if (n % i == 0) {
                sum += i;
                long d = n / i;
                if (d != i) {
                    sum += d;
                }
            }
        }
        return sum;
    }
}
class Bud {
    public static String buddy(long start, long limit) {
      for(long i = start; i <= limit; i++) {
            long test = getSumDivisors(i) - 1;
            if (test > start) {
                if(getSumDivisors(test) == i + 1) {
                    return "(" + i + " " + test + ")";
                }
            }
        }
        return "Nothing";
    }
  
  private static long getSumDivisors(long  num) {
   long sum = 0;
        for(long i = 1; i<=Math.sqrt(num); i++) {
            if (num%i == 0) {
                if (num/i == i || i == 1) {
                    sum += i;
                } else {
                    sum += i;
                    sum += num/i;
                }
            }
        }
        return sum;
  }
}
class Bud {
    public static String buddy(long start, long limit) {
        for (long n=start; n<=limit; n++){
            long nSum = getDivisorsSum(n), m = nSum-1, mSum = getDivisorsSum(m);
            if (mSum-1 == n && n < m)
                return String.format("(%s %s)", n, m);
        }
        return "Nothing";
    }
    private static long getDivisorsSum(long n) {
        long result = 0;
        for (long i = 2; i <= Math.sqrt(n); i++)
            if (n % i == 0)
                if (i == n / i)
                    result += i;
                else
                    result += (i + n/i);
        return result + 1;
    }
}

دیدگاهتان را بنویسید