假期刷题打卡--Day20

1、MT1173魔数

一个数字,把他乘以二,会得到一个新的数字,如果这个新数字依然由原数中那些数字组成,就称原数为一个魔数。输入正整数N,检查它是否是一个魔数,输出YES或者NO。

格式

输入格式:

输入正整数N

输出格式:

输出YES或者NO

样例 1

输入:

142857

输出:

YES
分析过程

看到这个题目的时候,第一想法是将输入数存入到一个数组当中,然后计算出2倍的输入数,然后拿计算出来的数一一和输入数的每一位进行对比。但是,在分析的时候,发现我遗漏了一下条件,这个题目需要实现的是两个条件:

  • 得到的两个数的个数相同,即每个数出现的次数应该是一样的;
  • 得到的两个数中的数字顺序可以不同,但是所含数字是一样的

所以,按照上述条件,我的解决思路是,先将两个数存入到两个数组当中,然后对两个数组里面的元素进行排序,如果每个元素都相同的话,则输出YES,否则输出NO。

        然后,按照这个思路,我写了一段代码:

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,a[10] = {0},b[10]={0};
    cin >> n;
    int q=n,m = 2 * n,p=m;
    int flag = 1;
    int count=0;
//首先将输入数存入数组中
    while(n!=0){
        a[count]=n%10;
        n/=10;
        count++;
    }
 //然后使用冒泡排序对输入数的元素进行从小到大排序
    for(int i=0;i<count-1;i++){
        for(int j=0;i<count-i-1;i++){//习惯性的把循环变量写成了i,但是在这应该是j
            if(a[j]>a[j+1]){
                int tmp = a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
        }
    } 
//将输入数的2倍数存入数组中
    while(m!=0){
        count = 0;//count每次放在里面,每次循环都置为0,最终结果只能是1,所以应该放在外面
        b[count]=m%10;
        m/=10;
        count++;
    }
    for(int i=0;i<count-1;i++){
        for(int j=0;i<count-i-1;i++){//这个也是同样的错误
            if(a[j]>a[j+1]){//这里是对b数组排序,而不是a,这里直接复制了,没有修改,应该全部修改为b
                int tmp = a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
        }
    } 
    for(int z=0;z>count;z++){//这里的判断语句就是错的,如果是>,那么永远无法为NO,所以,这里应该修改为<
        if(a[z]!=b[z]){
            flag = 0;
            break;
        }
    }
    if(flag==1) cout << "YES";
    else cout << "NO";
    return 0;
}

但是,只能通过一个用例:

于是,又开始了找错~

发现了好多个错误,难怪呢,于是,我把错误全部标在了上一个代码中。

修改错误后,得到了我想法的最终代码:

实现代码
#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,a[10] = {0},b[10]={0};
    cin >> n;
    int q=n,m = 2 * n,p=m;
    int flag = 1;
    int count=0,tmp;
//首先将输入数存入数组中
    while(n!=0){
        a[count]=n%10;
        n/=10;
        // cout << a[count];
        count++;
    }
    // cout << count;
 //然后使用冒泡排序对输入数的元素进行从小到大排序
    for(int i=0;i<count-1;i++){
        for(int j=0;j<count-1-i;j++){
            if(a[j]>a[j+1]){
                tmp = a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
        }
    } 
    // for(int i=0;i<count;i++){
    //     cout << a[i];
    // }
//将输入数的2倍数存入数组中
    count = 0;
    while(m!=0){
        b[count]=m%10;
        m/=10;
        // cout << b[count];
        count++;
    }
    // cout << count;
    for(int i=0;i<count-1;i++){
        for(int j=0;j<count-1-i;j++){
            if(b[j]>b[j+1]){
                tmp = b[j];
                b[j]=b[j+1];
                b[j+1]=tmp;
            }
        }
    } 
    // for(int i=0;i<count;i++){
    //     cout << b[i];
    // }
    for(int z=0;z<count;z++){
        if(a[z]!=b[z]){
            flag = 0;
            break;
        }
    }
    if(flag==1) cout << "YES";
    else cout << "NO";
    return 0;
}

我的这个思路感觉有点繁琐,所以,看了一下评论区的思路。

  • 每个数字出现的次数要相等
  • 用a、b两个数组分别记录两个数中每个数字(0~9)出现的个数,再比较a、b是否相等。

 用这个思路解决,代码行数大大减少(但是对于我来说,很难想到,现在慢慢学吧。):

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,a[10] = {0},b[10]={0};
    cin >> n;
    int q=n,m = 2 * n,p=m;
    int flag = 1;

    while(n!=0){
        int i=n%10;
        a[i]+=1;
        n/=10;
    }

    while(m!=0){
        int i = m%10;
        b[i]+=1;
        m/=10;
    }
    for(int z=0;z<10;z++){
        if(a[z]!=b[z]){
            flag = 0;
            break;
        }
    }
    if(flag==1) cout << "YES";
    else cout << "NO";
    return 0;
}

2、MT1176两个点的距离

给定笛卡尔平面上两个点的坐标,求它们之间的距离向上舍入为最接近的整数。

格式

输入格式:

输入整型,空格分隔

输出格式:

输出整型

样例 1

输入:

0 0 2 -2

输出:

3
相关知识点
1、笛卡尔平面

笛卡尔坐标系就是直角坐标系和斜坐标系的统称。

2、直角平面间两点的距离公式

    double a = pow((y2-y1),2);

    double b = pow((x2-x1),2);

    double l = sqrt(a+b);

实现代码
#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int x1,y1,x2,y2;
    cin >> x1 >> y1 >> x2 >> y2;
    double a = pow((y2-y1),2);
    double b = pow((x2-x1),2);
    double l = sqrt(a+b);
    printf("%.0f",l);
    // cout << l;
    return 0;
}

我没理解这个和选择结构有什么区别,不是输入输出类型的题吗。不理解~

3、MT1186do-while循环

请编写一个简单程序,从大到小输出所有小于n的正整数,直到0为止(不含0)。n从键盘输入

格式

输入格式:

输入整型数n

输出格式:

输出整型,空格分隔

样例 1

输入:

10

输出:

10 9 8 7 6 5 4 3 2 1
实现代码

do-while循环不常用,记录一下最基本的用法吧。

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n;
    cin >> n;
    do{
        cout << n << " ";
        n--;
    }while(n>0);
    return 0;
}

do-while语句需要注意的是,while后面需要加一个分号“;”

除此之外,也要注意,循环的基本条件,注意不能写反了。

明天继续吧。

相关推荐

  1. 假期--Day21

    2024-02-03 11:58:02       51 阅读
  2. 假期--Day28

    2024-02-03 11:58:02       53 阅读
  3. 假期总结--2

    2024-02-03 11:58:02       58 阅读
  4. [算法]Day1

    2024-02-03 11:58:02       43 阅读
  5. [算法]Day9

    2024-02-03 11:58:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-03 11:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-03 11:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-03 11:58:02       82 阅读
  4. Python语言-面向对象

    2024-02-03 11:58:02       91 阅读

热门阅读

  1. c++数据类型解释

    2024-02-03 11:58:02       45 阅读
  2. 小程序自定义组件——组件间通信与事件

    2024-02-03 11:58:02       63 阅读
  3. React useEffect使用

    2024-02-03 11:58:02       46 阅读
  4. Debezium发布历史105

    2024-02-03 11:58:02       37 阅读
  5. Linux升级openssh的解决方案

    2024-02-03 11:58:02       46 阅读
  6. CCF-CSP 202209-1 如此编码

    2024-02-03 11:58:02       49 阅读
  7. c++20

    c++20

    2024-02-03 11:58:02      45 阅读
  8. C++20新语法

    2024-02-03 11:58:02       37 阅读
  9. 20240202 大模型快讯

    2024-02-03 11:58:02       45 阅读
  10. github上传代码遇到的问题

    2024-02-03 11:58:02       60 阅读
  11. Linux——用户和用户组管理

    2024-02-03 11:58:02       45 阅读