回 帖 发 新 帖 刷新版面

主题:第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个回复)

沙发

第一题:
#include "stdio.h"
int main(void)
{
    int n,s,i,j=0;
    int sum=0,yushu;大  
    int a[100000];     //我内存太小了,定义大了就超出了
    printf("input n:\n");
    scanf("%d",&n);
    printf("input s:\n");
    scanf("%d",&s);
    for(i=1;i<=n;i++)
        if(n%i==0)
        {
            a[j]=i;
            sum=sum+a[j];
            j++;
        }
        yushu=sum%s;
        printf("the yushu is %d\n",yushu);
        return 0;
}

板凳

第二题:
#include "stdio.h"
#include "math.h"
int SumFactorMod(int n, int m, int s)
{
    int num=pow(n,m);
    int i;
    int sum=0,yushu;
    for(i=1;i<=num;i++)
       if(num%i==0)
       {
       sum=sum+i;   //我做的第一题这里有一步多余了,现在改过来了
              }
        yushu=sum%s;
        return yushu;
}
int main(void)
{
    int n,m,s;
    int result;
    printf("input n,m,s:\n");
    scanf("%d%d%d",&n,&m,&s);
    result=SumFactorMod(n,m,s);
    printf("the result is %d\n",result);
    return 0;
}

3 楼

干脆把第一题改下:
#include "stdio.h"
int SumFactorMod(int n, int s)
{
    int i;
    int sum=0,yushu;
    for(i=1;i<=n;i++)
        if(n%i==0)
        {
            sum=sum+i;
        }
        return sum%s;
}

int main(void)
{
    int n,s;
    int result;
    printf("input n,s:\n");
    scanf("%d%d",&n,&s);
    result=SumFactorMod(n,s);
    printf("the result is %d\n",result);
    return 0;
}

4 楼

int SumFactorMod(int n, int s)
{
    int temp=0;
    for(int i=1;i<n/2;i++)
        if(n%i==0)temp=temp+i+n/i;
    return(temp%s);
}

5 楼

int SumFactorMod(int n, int m, int s)
{
    return SumFactorMod(n^m,s);
}

6 楼

//第一题,第二题还缺思路
#include<iostream>
#include<math.h>
using namespace std;
int SumFactorMod(int, int);
int main(void)
{
    int s=0,n=0;
    char temp;
    do{
        cout<<"please input two positive integers, s,n(n is no bigger than 5,000,000, use any char to split the to numbers):";
        cin>>s>>temp>>n;
        if(s<=0 || n<=0 || n>5000000)
          cout<<"please input a correct number";
    }while(n>5000000||s<=0||n<=0);
    int result=SumFactorMod(n,s);
    cout<<"Under s=" <<s<<", n="<<n<<endl;
    cout<<"The final result is "<<result<<endl;
    system("pause");
    return 0;
}

int SumFactorMod(int n, int s)
{
    int a=0;
    for(int i=1;i<=(int)sqrt(n);i++)
    {
        if (!(n%i))
        {
              if(i*i!=n)
                  a+=i+n/i;
              else
                  a+=i;    
              a%=s;
        }
    } 
    return a;
}}

7 楼

/*
    第一题:......
    第二题:... ...
*/
#include <iostream.h>//
#include <math.h>//
#include <stdlib.h>//使用到exit()函数
#include <conio.h>//使用到获取键盘字符函数
const int MAX_M        =    300;//指数建议不要超过 MAX_M,不然计算结果将无法预料
int* getFactor(const int num);//取得因数表
int SumFactorMod(int n, int s);//取得余数
int SumFactorMod(int n, int m, int s);//取得n^m因数之和%s
bool    test1();
bool    test2();
int main()
{
    const char* text1="   第一题:  输入2个数字n,s。求数字n的所有因数之和除以s的余数.比如输入6 5 6的因数有1,2,3,6,因数之和为12,因为12除以5的余数为2 于是输出2。假设n,m都不超过5000000 \0";
    const char* text2="   第二题:  输入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。\0";
    cout<<text1<<endl;
    cout<<text2<<endl;
    cout<<"\n\t\t输入1选择题1进入测试    输入2选择题2进入测试"<<endl;
    char key=_getch();
    while(true)
    {
        switch(key)
        {
        case '1':test1();break;
        case '2':test2();break;
        case 0x1b:exit(0);
        default:break;
        }
        cout<<"请继续选择题目"<<endl;
        key=_getch();
    }
    return false;
}
int* getFactor(const int num)
{
    int *temp=new int[num];
    cout<<"数字n的所有因数如下"<<endl;
    int j=0;
    for(int i=1,k=0;i<=num;i++)
    {
        if(0==num%i)
        {
            cout<<i<<" ";
            temp[k++]=i;
            if(i==num)
            {
                for(j=k;j<num;j++)temp[j]=0;
                return temp;
            }
        }
    }
    cout<<endl;
    return temp;
}
int SumFactorMod(int n, int s)
{
    int *factor=new int[n];
    for(int i=0;i<n;i++)factor[i]=0;
    factor=getFactor(n);
    unsigned int sum=0;
    i=0;
    while(i<n&&factor[i]!=0)
    {
        sum+=factor[i];
        i++;
    }
    cout<<"因数之和为"<<sum<<endl;
    return sum%s;
}
int SumFactorMod(int n, int m, int s)
{
    unsigned int powN_M=(unsigned int)pow(n,m);
    unsigned int sum=SumFactorMod(powN_M,s);
    return sum%s;
}
bool    test1()
{
    cout<<"分别输入两个数n,s:"<<endl;
        int n=0,s=0;
        do{
            cin>>n;
            cin>>s;
            if(n<=0||s<=0)cout<<"n和s不能小于等于0,请重新输入"<<endl;
            if(n>5000000)
            {
                cout<<"n不能超过5000000,请重新输入"<<endl;
            }
            if(s>5000000)
            {
                cout<<"s不能超过5000000,请重新输入"<<endl;
            }
        }while(n>5000000 || s>5000000 || n<=0 || s<=0);
        
        cout<<"数字n的所有因数之和除以s的余数为"<<SumFactorMod( n , s )<<endl;
        return true;
}
bool    test2()
{
    cout<<"分别输入三个数n,m,s:"<<endl;
        int n=0,m=0,s=0;
        do{
            cin>>n;
            cin>>m;
            cin>>s;
            if(n<=0||s<=0)cout<<"n和s不能小于等于0,请重新输入"<<endl;
            if(n>5000000)
            {
                cout<<"n不能超过5000000,请重新输入"<<endl;
            }
            if(m>MAX_M)
            {
                cout<<"m建议不要超过"<<MAX_M<<",否则计算结果将无法预料请重新输入"<<endl;
            }
            if(s>5000000)
            {
                cout<<"s不能超过5000000,请重新输入"<<endl;
            }
        }while(n>5000000 || s>5000000 || n<=0 || s<=0);
        
        cout<<"数字"<<n<<"的"<<m<<"次方的所有因数之和除以"<<m<<"的余数"<<SumFactorMod(n,m,s)<<endl;
        return true;
}

8 楼

代码 中

cout<<"数字"<<n<<"的"<<m<<"次方的所有因数之和除以"<<s<<"的余数"<<SumFactorMod(n,m,s)<<endl;

这一行不小心 把s写成了 m
[em10][em10][em10][em10]

9 楼

第一题:
#include <stdio.h>
#include <math.h>
int SumFactorMod(int n, int s);
main()
{
    int n,s,result;
    printf("Please input n and s:\n");
    scanf("%d%d",&n,&s);
    result=SumFactorMod(n, s);
    printf("The result is %d",result);
}
int SumFactorMod(int n, int s)
{
        int sum=n+1,i,j;
        j=sqrt(n);
        for(i=2;i<=j;i++)
        {    if(n%i==0)
                      sum+=i+n/i;
        }
        if(j*j==n)
                  sum-=j;
        return sum%s;
}
第二题:
#include <stdio.h>
#include <math.h>
int SumFactorMod(int n, int m, int s);
main()
{
    int n,m,s,result;
    printf("Please input n m and s:\n");
    scanf("%d%d%d",&n,&m,&s);
    result=SumFactorMod(n,m,s);
    printf("The result is %d",result);
}
int SumFactorMod(int n, int m, int s)
{
    int p,sum,i,j;
    p=pow(n,m);
    sum=p+1;
    j=sqrt(p);
    for(i=2;i<=j;i++)
    {
        if(p%i==0)
            sum+=i+p/i;
    }
    if(j*j==p)
        sum-=j;
    return sum%s;
}

10 楼

第一题的代码:运行最大值时候时间不超过1s 但是感觉还是挺慢的,看的出来
实在想不出有什么更好的方法了

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

int SumFactorMod(int n, int s)
{
    int a[1000];
    int sum = 0;
    int index = 0;;
    if(n <= 5){                                
         for(int i = 1; i <= n; i ++)          
         if(n % i == 0)
         sum += i;
         }
         else{
          
          for(int i = 2; i <= sqrt(n); i ++){
            int j = i * i;
           
            while(j <= n ){
                    j += i;
                    if(j == n)
                    a[index++] = i; 
            } 
     }
     for(int i = 0; i < index ; i++)
     sum +=(a[i] + n /a[i]);
     sum += 1 + n;
     }
     printf("%d\n",sum % s);     
    
    }
int main(void)
{
    int n,s;
    
    while(1)
    {
    scanf("%d%d",&n,&s);
    
    SumFactorMod(n, s);
    }
    system("pause");
     return 0;
    
}

我来回复

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