noip第11课作业

时间:2021-09-12 21:57:20

1.    数字比较

定义一个函数check(n,d),让它返回一个布尔值,如果数字d在正整数n的某位中出现则返回true,否则返回false。

例如:check(325719,3)==true;check(77829,1)==false;

【样例输入1】

325719 3

【样例输出1】

true

【样例输入2】

77829 1

【样例输出2】

false

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int check(string a,char b){
    for(int i = 0;i < a.length(); i++){
        if(a[i] == b){
            return 1;
        }
    }
    return 0;
}
int main(){
    string c;
    char d;
    cin>>c;
    cin >> d;
    if(check(c,d)==1){
        cout << "true";
    }else{
        cout << "false";
    }
    return 0;
} 

2.    图像旋转

【问题描述】

输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。

输入:第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。

输出:m行,每行n个整数,为顺时针旋转90度后的图像。相邻两个整数之间用单个空格隔开。

【样例输入】

3 3

1 2 3

4 5 6

7 8 9

【样例输入】

7 4 1

8 5 2

9 6 3

#include<iostream>
using namespace std;
int a[101][101];
int main(){
    int m,n;
    cin >> m >> n;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }         
    }         
    for(int j=1;j<=n;j++){
        for(int i=m;i>=1;i--){
            cout<<a[i][j]<<" ";
        } 
        cout<<endl;
    }
}

1.     算术表达式求值

两位正整数的简单算术运算(只考虑整数运算),算术运算为:

+,加法运算; -,减法运算; *,乘法运算; /,整除运算; %,取余运算。

算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运算数

请输出相应的结果。

输入:一行算术表达式;

输出:输出计算结果,保留两位小数;

要求:使用函数的方法来计算。

【样例输入】

32+64

【样例输出】

96.00

#include <iostream>
#include <iomanip>
using namespace std;
int add(int a, int b){
    return a+b;
}
int sub(int a, int b){
    return a-b;
}
int mul(int a, int b){
    return a*b;
}
double div(int a, int b){
    return a*1.0/b;
}
int main(){
    int m, n;
    char x;
    double c;
    cin >> m >> x >> n;
    if(x=='+'){
        c=add(m,n);
    }
    if(x=='-'){
        c=sub(m,n);
    }
    if(x=='*'){
        c=mul(m,n);
    }
    if(x=='/'){
        c=div(m,n);
    }
    cout << fixed << setprecision(2) << c << endl;
    return 0;
}

2.    区间内的真素数

找出整数M到N之间的真素数;

真素数的定义: 如果一个正整数为素数,且其反序也为素数,那么这个正整数就为真素数。例如,11,13 均为真素数,因为11的反序还是为11,13 的反序为 31 也为素数。

输入:两个数 M 和 N,空格间隔,1 <= M <= N <= 100000。

输出:按从小到大输出 M 和 N 之间(包括 M 和 N )的真素数,逗号间隔。如果之间没有真素数,则输出 No。

【样例输入】

10 35

【样例输出】

11,13,17,31

#include<iostream>
#include<cmath>
using namespace std;
//13
int fanxu(int n)//返回n的反序数 
{
    int sum=0,l;
    while(n!=0){
        l=n%10;   //
        sum=sum*10+l;  //sum = 3
        n/=10;  //1
    }
    return sum;   //31
}
int prime(int n){  //7
    int i;
    if(n==1){
        return 0;
    }
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0){
            return 0;
        }        
    }
    return 1;
}
int main(){
    int n,m,v=1,i;
    cin >> m >> n;
    for(i=m;i<=n;i++){
        if(prime(i)==1&&prime(fanxu(i))==1){
            if(v==0){
                cout<<",";
            }
        v=0;
        cout<<i;
        }
    }
    if(v==1){
        cout<<"No"<<endl;
    }    
    return 0;
}

3.    哥德巴赫猜想

哥德巴赫猜想的命题之一是:大于6的偶数等于两个素数之和,输入两个数字m和n,将m和n之间(包括m和n)所有的偶数表示成两个素数之和。

输入:一行两个正整数m和n,其中5<m<n<100;

输出:将m和n之间所有偶数表示成两个素数之和,如果有多种分解方法,输出包含最小素数的那一个,例如10=5+5,10=3+7,我们只用输出10=3+7就可以了;

【样例输入】

6 10

【样例输出】

6 = 3 + 3

8 = 3 + 5

10 = 3 + 7

#include <iostream>
using namespace std;
bool prime(int n){
    if(n==1){
        return false;
    }else{
        for(int i = 2;i < n;i++){
            if(n%i ==0){
                return false;
            }
        }
    return true;
    }    
} 
int main(){
    int m,n;
    cin >> m>> n;
    for(int i=m;i<= n;i++){
        if(i % 2 == 0){
            for(int j = 2;j < i;j++){
                if(prime(j)&&prime(i-j)){
                    cout << i << " = " << j << " + " << (i-j) << endl; 
                    break;
                }
            }
        }
    }
    return 0;
}