C++U2-第11课-单元复习(二)

发布时间 2023-11-05 20:30:55作者: 小虾同学

上节课作业

 单元复习(二)

[【字符串】作者名]

【思路分析】
1、定义字符串s

2、 使用cin>>s,输入字符串

3、输出字符串的第一个字符s[0],因为第一个作者名前面没有-

4、遍历字符串,遇到 - 的位置,输出此位置的下一个位置

【参考代码】
#include<iostream>
#include<string>
using namespace std;
int main()
{
    //1、定义字符串 
    string s;
    //2、输入字符串 
    cin >> s;
    //3、输出第一个作者名的首字母 
    cout << s[0];
    //4、遍历字符串,i=0已经处理了,从i=1开始 
    for(int i = 1; i < s.size(); i++)
    {
        if(s[i] == '-')   //遇到 - ,输出下一个位置 
            cout << s[i + 1];   
    }
    return 0;
}
点击展开代码

 [【双重循环】神奇数字]

 

【思路分析】
1、输入整数 n

2、预处理 1~100 中,符合条件的 s 
2
​
 ,存入 idx 数组中

​ 1.个位数是一定是符合题意的

​ 2.十位数去判断个位和十位是否相等

3、从小到大遍历符合条件的 s 
2
​
 ,根据式子求出 s1

​ 1.要注意 s 
1
​
  的范围,有可能超过 int

4、判断 s 
1
​
  是否符合题意

​ 1.数组记录 s 
1
​
  的每一位数字出现的次数

​ 2.细节点:标记,清空数组

【参考代码】
#include<iostream>
using namespace std;
int idx[100],cnt;
bool vis;
int main()
{
    //1、输入整数n 
    long long n;
    cin >> n;
    //2、预处理1~100中,符合条件的s2,存入idx数组 
    for(int i = 1; i < 99; i++)
    {
        //2.1、个位数符合题意 
        if(i >= 1 && i <= 9)               
            idx[++cnt] = i;
        else
        {
            //2.2、十位数,判断个位和十位是否相等 
            int ge = i % 10 , shi = i / 10;       
            if(ge != shi)
                idx[++cnt] = i;
        }
    }
    //3、根据s1/s2=n,求出符合条件的s1
    for(int i = 1; i <= cnt; i++)    //从小到大枚举s2 
    {
        //3.1、s1有可能超过int的范围 
        long long  s1 = (long long)idx[i] * n , k;   
        //4、判断s1是否符合条件:每一位都不相同
        k = s1;  //s1的替身
        //4.1、判断每一位数字出现的次数
        int book[15];
        for(int i = 0; i < 10; i++)   //清空 
            book[i] = 0;
        while(k)
        {
            book[k % 10]++;
            k /= 10;
        } 
        bool flag=false;   //标记 
        for(int i = 0; i <= 9; i++)
        {
            if(book[i] > 1)  //出现的次数大于1 
            {
                flag = true;
                break;
            }
        }
        if(flag == false)   //符合条件 
        {
            vis = 1;
            cout << s1 << "/" << idx[i] << "=" << n << endl;  //控制格式输出 
        }     
    } 
    if(vis == 0)      //没有一个符合条件 
        cout << "No";    
    return 0;
}
点击展开代码

 

位运算

[【数学思维】完全平方数]

 

【题意分析】
多组样例,每一组样例求出这个区间内完全平方数的个数。每组样例占一行。

【思路分析】
1、定义变量t、a、b,注意数据范围

2、利用循环结构,实现多组输入

3、输出答案

​ 1、[1,n] 中完全平方数的最大值为 sqrt(n) * sqrt(n)。sqrt(n) * sqrt(n)<=n,若超过 sqrt(n),则两数相乘超过 n

​ 2、[1,n] 中完全平方数的个数为 sqrt(n)。sqrt(n) * sqrt(n)为完全平方数,则 sqrt(n-1) * sqrt(n-1)、sqrt(n-2) * sqrt(n-2)......sqrt(1) * sqrt(1) 也为完全平方数。

​ 3、[a,b] 的完全平方数的个数为 sqrt(b)-sqrt(a-1)

【参考代码】
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    //1、定义变量t、a、b,注意数据范围
    int t;
    long long a , b;
    cin >> t;
    //2、利用循环结构,实现多组输入
    while(t--)
    {
        cin >> a >> b;
        //3、输出答案
        cout << (int)(sqrt(b) - sqrt(a-1)) <<endl;
    }
    return 0;
}
点击展开代码

 

 

 

上节课作业

1、闰年

【题意分析】
对于输入的年份判断当前年份是否是闰年,根据每4年一闰,每100年不闰,每400年又要闰规则

【思路分析】
定义一个y表示我们当前输入的年份

用函数判断我们当前是否为闰年,如果 y 是闰年就返回 true;如果 y 是平年就返回 false

根据闰年规则4年一闰,每100年不闰,每400年又要闰经行判断,然后当前的数符合4或400的倍数不是100的倍数

如果 is_leap 函数返回 true,则说明是闰年

如果 is_leap 函数返回 false,则说明是平年

【参考代码】
/*
    定义函数判断当前的年份是否为闰年,按照4年一闰百年不闰,四百年一闰的规则,是闰年输出yes不是输出no
*/

#include <iostream>
using namespace std;

bool is_leap(int y) {
    //根据闰年规则4年一闰,每100年不闰,每400年又要闰经行判断,然后当前的数符合4或400的倍数不是100的倍数 
    if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) {
        return true;
    }
    else {
        return false;
    }
}
int main() {
    //定义一个y表示我们当前输入的年份 
    int y;
    cin >> y;
    //用函数判断我们当前是否为闰年,如果 y 是闰年就返回 true;如果 y 是平年就返回 false 
    if (is_leap(y) == true){
        // 如果 is_leap 函数返回 true,则说明是闰年
        cout << "YES";   
    }
    else{
        // 如果 is_leap 函数返回 false,则说明是平年
        cout << "NO";  
    }
    return 0;
}
点击展开代码

 

 2、回文数判定

【题意分析】
我们需要对一个数判断是否为回文数

【思路分析】
先将一个数倒过来然后将倒过来的数和原数比较,相同就为回文数

定义函数判断当前的数是否是回文数

定义一个t用来储存n的颠倒过来的数

每次t*10,然后取出m的尾数

倒过来的数 t,t == n,就是回文数

定义n并且输入n

用函数判断n是不是回文数

【参考代码】
/*
先将一个数倒过来然后将倒过来的数和原数比较,相同就为回文数
*/
#include <iostream>
using namespace std;
//定义函数判断当前的数是否是回文数
bool is_pal(int n) {
    //定义一个t用来储存n的颠倒过来的数
    int m = n, t = 0;
    while (m > 0) {
        //每次t*10,然后取出m的尾数
        t = t * 10 + m % 10;
        m /= 10;
    }
    // 倒过来的数 t,t == n,就是回文数
    if (t == n) {
        return true;
    }
    else {
        return false;
    }
}

int main() {
    //定义n并且输入n
    int n;
    cin >> n;
    //用函数判断n是不是回文数
    if (is_pal(n)) {
        cout << "Yes" << endl;
    }
    else {
        cout << "No" << endl;
    }
    return 0;
}
点击展开代码

 

3、三角形面积

【题意分析】
求出p,然后将我们的数都带入到海伦公式计算得出答案

【思路分析】
将abc带入海润公式求解得到三角形面积,对于答案保留小数

定义a,b,c然后输入

将a,b,c带入自定义函数求结果

先求出p的值,然后带入海伦公式计算

输出求的的三角形面积,保留两位小数

【参考代码】
/*
    将abc带入海润公式求解得到三角形面积,对于答案保留小数
*/
#include <iostream>
#include <cmath>
using namespace std;
double js(int a,int b,int c){
    //先求出p的值,然后带入海伦公式计算
    double p = (a + b + c) / 2;
    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    return s;
}
int main() {
    //定义a,b,c然后输入
    double a, b, c;
    cin >> a >> b >> c;
    //将a,b,c带入自定义函数求结果
    s=js(a,b,c);
    //输出求的的三角形面积,保留两位小数
    printf("%.2f", s);
    return 0;
}
点击展开代码

 

4、回文素数

【题目分析】
【题意分析】
对于输入的数需要判断当前这个数是否为素数,这个数又同时需要判断是否为回文数,同时满足我们输出YES

【思路分析】
将当前的数倒过来和原来的数比较判断是否相同,相同为回文数

for循环判断当前的数是否有除了1和自己本身的因子,有的话,当前的数不是素数

【参考代码】
#include <iostream>
#include <cmath>
using namespace std;


bool is_pal(int n) {// 实现 is_pal 函数,如果 n 是回文数,则返回 true,否则返回 false 
    int t = n, m = 0;
    while (t > 0) {
        m = m * 10 + t % 10;
        t /= 10;
    }
    if (n == m) {
        return true;
    }
    else {
        return false;
    }

}


bool is_prime(int n) {// 实现 is_prime 函数,如果 n 是素数,则返回 true,否则返回 false
    if (n == 1)return false;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
int main() {
    int n;
    cin >> n;
    // 如果 is_pal(n) 返回 true,并且 is_prime(n) 返回 true,则说明 n 是回文素数 
    if (is_pal(n) && is_prime(n)) {
        cout << "Yes";
    }
    else {  // 否则,n 不是回文素数 
        cout << "No";
    }
    return 0;
}
点击展开代码

 

5、素数对

【题目分析】
【题意分析】
求出我们n以内有多少个素数是相差2的,那些数是素数对

【思路分析】
for循环判断一个数除了1和本身没有其他因子,如果有那么就不是素数,然后判断两个相差为2的数是否都为素数

定义一个bool变量,如果b为true,则表示找到了,为false则表示没找到。

因为2与任何一个素数的差都不为2,所以可以直接从3开始枚举。

判断两个数是否为素数,是素数的话标记我们有素数对

函数判断是否为素数,for循环判断一个数除了1和本身没有其他因子

最后判断标识符是否为false,为false则没有遇到素数对

【参考代码】
/*
for循环判断一个数除了1和本身没有其他因子,如果有那么就不是素数,然后判断两个相差为2的数是否都为素数
*/
#include <iostream>
#include <cmath> 
using namespace std;

int n;
//定义一个bool变量,如果b为true,则表示找到了,为false则表示没找到。
bool b;

//函数判断是否为素数,for循环判断一个数除了1和本身没有其他因子
bool is_prime(int n) {
    for (int i = 2; i < n; i++) {  
        if (n % i == 0) {
            return false;  
        }
    }
    return true;
}

int main() {
    cin >> n;
    //因为2与任何一个素数的差都不为2,所以可以直接从3开始枚举。 
    for (int i = 3; i <= n - 2; i++) {
        //判断两个数是否为素数,是素数的话标记我们有素数对
        if (is_prime(i) && is_prime(i + 2)) {
            b = true;
            cout << i << " " << i + 2 << endl;
        }
    }
    //最后判断标识符是否为false,为false则没有遇到素数对
    if (b == false) {
        cout << "empty";
    }
    return 0;
}
点击展开代码