题目1

【问题描述】

2500年前数学大师毕达哥拉斯就发现,正整数数对220和284之间存在着奇妙的联系: 220的因数之和(除了自身之外的因数)为1+2+4+5+10+11+20+22+44+55+110=284,而284的因数之和则为1+2+4+71+142=220。毕达哥拉斯把这样的数对称为相亲数(注意:构成相亲数的两个数不等。一个为雄数,另一个称为雌数)。编程求M和N(M、N为大于1并且在unsigned表示范围内)之间的所有相亲数。M、N由用户从键盘上输入。

【输入形式】

用户输入两个正整数保存到M和N中,以一个空格分隔,如:

100 300

【输出形式】

程序找出M到N间的各相亲数并输出。各相亲数的输出格式:先输出该相亲数是M到N间的第几个相亲数,再输出该相亲数中的雌、雄数及其因子计算式。雌雄数输出时分别各占一行,输出时先输出雌雄数的值,再输出英文冒号“:”,再从1开始输出各因数相加的公式,最后输出英文等号“=”和所有因数之和。注意:所有输出因素间无空格。各相亲数间空一行间隔输出。

【样例输入】

100 300

【样例输出】

1

220:1+2+4+5+10+11+20+22+44+55+110=284

284:1+2+4+71+142=220

【样例说明】

样例中1表示100~300间第1对相亲数。220和284是构成这对相亲数中的雌雄数,注意它们的输出格式。

【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;

int main(){

int a,b,c,d,e,f,g,h,sum,sum2,t,i;
cin>>a>>b;
h=1;
double vals[] = {220,284,1184,1210,2620,2924,5020,5564,6232,6368,10744,10856};


for(t=0;t<12;t++){

if(vals[t]>a && vals[t]<b){

cout<<h<<endl;
h++;

e=vals[t];
cout<<e<<":1";
for(i=2;i<e;i++)
{
if( e%i==0)
{
cout<<"+"<<i;
sum+=i;
}
}
cout<<"="<<vals[t+1]<<endl;
t++;
f=vals[t];
cout<<f<<":1";
for(i=2;i<f;i++)
{
if(f%i==0)
{cout<<"+"<<i;
sum2+=i;
}
}
cout<<"="<<vals[t-1]<<endl;

}
else{t++;}

}cout<<"\b";
system("pause"); }

题目2

【问题描述】

绝对素数是指本身是素数,其逆序数也是素数的数。例如:10321与12301是绝对素数。

编写一个程序,求出所有m~n(m≥11,n≤1000000)之间的绝对素数

【输入形式】

两个整数m和n。

【输出形式】

m~n之间的绝对素数,每个数之间用空格隔开,每行输出10个

【样例输入】

11 300

【样例输出】

11 13 17 31 37 71 73 79 97 101
107 113 131 149 151 157 167 179 181 191
199

【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<stdio.h>
int prime(int m){

for (int i = 2; i < m-1; i++)
{
if (m%i==0) return 0;
}
return 1;
}

int inv(int n){
int m=0;
while(n>0){
m=m*10+n%10;//检验回文数,取每个数的尾数
n/=10;
}
return m;
}

void print_int(int m){
if((m/100)==0){
printf(" %d",m);//确定数字前加几个空格
}else printf(" %d",m);

}

int main(){
int m,n,j=0;
scanf("%d%d",&m,&n);
for (int i = m; i < n; i++)
{

if(prime(inv(i))==1&&prime(i)==1){
print_int(i);
j++;
if(j==10){
putchar('\n');//j=10时换行并置0
j=0;
}
}
}

return 0;
}

代码可能略有不足,请大佬多多指教