回 帖 发 新 帖 刷新版面

主题:第48次编程比赛题目

第一题:

输入2个数字n,s。求数字n的所有因数之和除以s的余数。 

比如输入6 5 
6的因数有1,2,3,6,因数之和为12,因为12除以5的余数为2 
于是输出2。 

假设n,s都不超过5000000 

第二题:
输入3个数字n, m, s。求数字n的m次方的所有因数之和除以m的余数。 
比如输入6 2 5 
6^2=36 
36的因数有1,2,3,4,6,9,12,18,36,因数之和为91 
91除以5的余数为1,所以输出1。
假设n, m, s都不超过5000000 

接口请定义为:
int SumFactorMod(int n, int s);
int SumFactorMod(int n, int m, int s);

有问题请在次联系:
http://www.programfan.com/club/showbbs.asp?id=217779

回复列表 (共26个回复)

21 楼

第一题

#include <stdio.h>
#include <stdlib.h>

long SumFactorMod(long n,long s)
{
      long i;
      long sum=0; 
      for(i=1;i<=n;i++)
      {
         if(n%i==0)sum+=i;
        }
       
        return sum%s;
      }

int main(int argc, char *argv[])
{
  printf("%d\n",SumFactorMod(6,5)); 
  system("PAUSE");    
  return 0;
}



第二题:
#include <stdio.h>
#include <stdlib.h>

long SumFactorMod(long n,long m,long s)
{
      long i;
      long sum=0; 
      long temp;
      temp=n^m; 
      for(i=1;i<=temp;i++)
      {
         if(n%i==0)sum+=i;
        }
       
        return sum%s;
      }

int main(int argc, char *argv[])
{
  printf("%d\n",SumFactorMod(6,2,5)); 
  system("PAUSE");    
  return 0;
}

在Dev C++ 4.9编译通过

22 楼

//幸亏今天看了一眼论坛,不然真的就要错过了.希望参与的人越来越多
//GOOD LUCK    [em2]
#include "iostream.h"
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h>
#define M 350
int zhishu[M] = 
{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,
61,67,71,73,79,83,89,97,101,103,107,109,113,127,
131,137,139,149,151,157,163,167,173,179,181,191,
193,197,199,211,223,227,229,233,239,241,251,257,
263,269,271,277,281,283,293,307,311,313,317,331,
337,347,349,353,359,367,373,379,383,389,397,401,
409,419,421,431,433,439,443,449,457,461,463,467,
479,487,491,499,503,509,521,523,541,547,557,563,
569,571,577,587,593,599,601,607,613,617,619,631,
641,643,647,653,659,661,673,677,683,691,701,709,
719,727,733,739,743,751,757,761,769,773,787,797,
809,811,821,823,827,829,839,853,857,859,863,877,
881,883,887,907,911,919,929,937,941,947,953,967,
971,977,983,991,997,1009,1013,1019,1021,1031,1033,
1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,
1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,
1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,
1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,
1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,
1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,
1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,
1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,
1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,
1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,
1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,
1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,
1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,
2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,
2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,
2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,
2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,
2333,2339,2341,2347,2351,2357};
int mi[M];
int SumFactorMod(int n, int s);
main()

    int n = 0;
    int s = 0;
    cout << "enter the number n:" <<endl;
    cin >> n;
    cout << "enter the number s:" <<endl;
    cin >> s;
    if ((n<=0) || (s<=0))
    {
        cout << "请输入正整数!";
        system("pause");
        return;
    }
    int answer = SumFactorMod(n, s);
    cout << "The answer is " << answer  << endl;
    system("pause");
    return;
}
long fun(int x,int y)
{
    long answer = 1;
    for (int i = 0; i <= y; i++)
    {
        answer *= x;
    }
    answer --;
    answer /= (x-1);
    return answer;
}
int SumFactorMod(int n, int s)
{
    memset(mi, 0, M);
    for (int i = 0; i < M; i++)
    {
        while (n%zhishu[i] == 0)
        {
            n = n/zhishu[i];
            mi[i]++;
        }
        if (n == 1)
        {
            break;
        }
    }
    __int64 answer = 1;
    for (i = 0; i < M; i++)
    {
        if (mi[i]>0)
        {
            answer *= fun(zhishu[i], mi[i]);
        }
    }
    if (answer < 2)
    {
        answer = n+1;
    }
    return (answer%s);
}

23 楼


[em1][em1][em1][em1][em1][em1][em1]

24 楼

呵呵~~
也做一个简单的^_^
[code]/*
第一题:

输入2个数字n,s。求数字n的所有因数之和除以s的余数。 

比如输入6 5 
6的因数有1,2,3,6,因数之和为12,因为12除以5的余数为2 
于是输出2。 

假设n,s都不超过5000000 
*/

#include <stdio.h>

int SumFactorMod(int n, int s)
{
     int factor = 0, sum = 0;
    while(++factor <= n / factor)
        if(n % factor == 0)
            sum += factor + n / factor;
    return sum % s;
}

int main(void)
{
    int n, s;
    printf("请输入 n : ");
    scanf("%d", &n); 
    printf("请输入 s : ");
    scanf("%d", &s);             
    printf("\n%d的所有因数之和除以%d的余数的是%d.\n",n, s, SumFactorMod(n, s));
    system("pause");
    return 0;
}
[/code]

25 楼

困了,只做了第2题。简单描述下算法,n分解质因数,设n=a1^t1 * a2^t2 .....* ak^tk ,则n的因数和
sum = (a1^0+a1^1+a1^2...a1^t1) * (a2^0+a2^1+a2^2...a2^t2) * .....  (1)
所以只要分解质因数再计算(1)式对s取模即可。


int SumFactorMod(int n, int m, int s)
{
    __int64 result = 1;//保存结果。 如果编译器是devcpp,请用long long

    for (int factor=2; factor<=n; factor++)  //从2到n简单的试除法,方便。
    {
        if (factor>2 && !(factor & 0x00000001)) break;  //大于2的偶数,不用试除
        if (factor > sqrt(n)) factor = n; //大于sqrt(n),不用再试,n已经是质数了

        int temp = 1;  //temp保存(ak^0+ak^1+ak^2...ak^tk)
        while (n % factor == 0)
        {
            n /= factor;
            for (int i=0; i<m; i++)
            {
                temp *= factor;
                temp ++;
                if (temp > s) temp %= s;
            }
        }

        result *= temp;
        if (result > s) result %= s;
    }

    return int(result % s);
}

26 楼

时间到。

我来回复

您尚未登录,请登录后再回复。点此登录或注册