主题:第48次编程比赛题目
iAkiak [专家分:8460] 发布于 2007-02-09 09:40:00
第一题:
输入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
最后更新于:2007-02-09 11:48:00
回复列表 (共26个回复)
沙发
ldb2741 [专家分:2570] 发布于 2007-02-09 10:08:00
第一题:
#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;
}
板凳
ldb2741 [专家分:2570] 发布于 2007-02-09 10:22:00
第二题:
#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 楼
ldb2741 [专家分:2570] 发布于 2007-02-09 10:40:00
干脆把第一题改下:
#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 楼
qqlxinye [专家分:650] 发布于 2007-02-09 11:57:00
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 楼
qqlxinye [专家分:650] 发布于 2007-02-09 11:59:00
int SumFactorMod(int n, int m, int s)
{
return SumFactorMod(n^m,s);
}
6 楼
雪光风剑 [专家分:27190] 发布于 2007-02-09 12:07:00
//第一题,第二题还缺思路
#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 楼
skybtone [专家分:160] 发布于 2007-02-09 13:11:00
/*
第一题:......
第二题:... ...
*/
#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 楼
skybtone [专家分:160] 发布于 2007-02-09 13:14:00
代码 中
cout<<"数字"<<n<<"的"<<m<<"次方的所有因数之和除以"<<s<<"的余数"<<SumFactorMod(n,m,s)<<endl;
这一行不小心 把s写成了 m
[em10][em10][em10][em10]
9 楼
独行者 [专家分:1280] 发布于 2007-02-09 13:34:00
第一题:
#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 楼
wshong [专家分:1880] 发布于 2007-02-09 14:36:00
第一题的代码:运行最大值时候时间不超过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;
}
我来回复