c++作业存档
- 美素数
问题描述 :
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
输入:
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <=
1000000),表示区间的左值和右值。
输出:
对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。格式:Case(空格)#(组数):空格(结果)
样例输入:
3
1 100
2 2
3 19
样例输出:
Case #1: 14
Case #2: 1
Case #3: 4
代码:
#include<iostream>
#include<cmath>
using namespace std;
int prime(int x)
{
if (x == 1)return 0;
int i, k = sqrt((double)x);
for (i = 2; i <= k; i++)if (x%i == 0)return 0;
return 1;
}
int b_prime(int x)
{
int y = 0;
if (!prime(x))return 0;
while (x)
{
y
+= (x % 10);
x /= 10;
}
if (!prime(y))return 0;
return 1;
}
int main()
{
int T, L, R, s, i, t;
cin
>> T;
t
= T;
while (T--)
{
s
= 0;
cin>>L>>R;
for (i = L; i <= R; i++)
{
if (b_prime(i))s++;
}
cout<<"Case #"<<t-T<<": "<<s<<endl;
}
return 0;
}}
- 加法逆与乘法逆
加法逆和乘法逆是密码学中的两个概念.设有两个正整数m、n,满足m<n且n¹0的条件,则m在n内的加法逆k(k为小于n且不为0 的正整数)满足 (m+ k)mod n=0, m在n内的乘法逆l(l小于n且不为0)满足 (m*l) mod n =1。请编写程序,输入两个正整数n、m,计算输出m在n内的加法逆与乘法逆,如不存在,则输出0.
Input
多组测试输入,每行输入两个数字 n m(n>m,且n≠0,m≠0)
Output
对于每组输入,输出对应的加法逆k与乘法逆 n
Sample Input
3
10 3
11 6
12 4
Sample Output
7 7
5 2
8 0
Hint:
输入说明:
2 测试组数
10空格3换行 表示n,m
输出说明:
7空格7换行
6空格2换行
代码:
#include <iostream>
using namespace std;
int main(){
int
times=0;
cin
>>times;
while(times){
int
n=0,m=0,k=0,l=0;
cin>>n>>m;
for(int
i=1;i<n;i++){
if(i!=m
&& (i+m)% n ==0){k=i;}
if(i!=m
&& (i*m)% n ==1){l=i;}
}
cout<<k<<"
"<<l<<endl;
times--;
}
return
0;
}