假期刷题打卡--Day24

1、MT1198阶乘差

求1!-2!-3!-…-n!

格式

输入格式:

输入为整型

输出格式:

输出为整型

样例 1

输入:

5

输出:

-151
分析过程

        看到这个题目的时候,感觉这个题目出现的没有必要,就和前面阶乘和一样的,但是在自己写了之后才发现了两者的区别,当计算阶乘和的时候,sum=0可以直接计算,但是如果是结成差,就需要注意,若sum初值为0,那么0-1就直接是个负数,最终结果就是错误的。所以sum的初值应该从1的阶乘1开始,而循环初值也应该从2开始。

        按照上述思路,我第一次写的代码如下:

#include<bits/stdc++.h> 

using namespace std;

int s(int a){
    int sum1 = 1;
    for(int i=1;i<=a;i++){
        sum1 *= i;
    }
    // cout << sum1 << "##";
    return sum1;
}
int main( )
{
    int n,sum=1;
    cin >> n;
    for(int i=2;i<=5;i++){
        sum -= s(i);
    }
    cout << sum;
    return 0;
}

但是,这个代码却一个用例都不能通过,原因如下:我出现了一个最不应该出的错误:在计算sum的时候,循环条件写成了样例的输入值; 

所以,将5改成n就可以了。 

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

using namespace std;

int s(int a){
    int sum1 = 1;
    for(int i=1;i<=a;i++){
        sum1 *= i;
    }
    // cout << sum1 << "##";
    return sum1;
}
int main( )
{
    int n,sum=1;
    cin >> n;
    for(int i=2;i<=n;i++){
        sum -= s(i);
    }
    cout << sum;
    return 0;
}

这个确实不该错的。

2、MT1199公式计算

输入正整数n和r,计算公式 (n!) / (n-r)!。

格式

输入格式:

输入整型,空格分隔。

输出格式:

输出实型,保留2位小数。

样例 1

输入:

2 1

输出:

2.00
分析过程

还是和前面一样的分析思路,首先用一个函数计算阶乘,然后在主函数中调用,但是发现只能通过一个用例

#include<bits/stdc++.h> 

using namespace std;

int s(int a){
    int sum1 = 1;
    for(int i=1;i<=a;i++){
        sum1 *= i;
    }
    return sum1;
}
int main( )
{
    int n,r;
    double c;
    cin >> n >> r;
    c = s(n)/s((n-r));
    printf("%.2f",c);
    return 0;
}

所以,开始寻找错误: 

没找到,所以就去评论区看了一下别人的思路,发现,他们都是站在阶乘计算的位置上思考问题,而我是站在出发的位置上思考,看了之后,就直接修改了代码:

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

using namespace std;

int main( )
{
    int n,r;
    double res=1;
    cin >> n >> r;
    for(int i=n-r+1;i<=n;i++) res*=i;
    printf("%.2lf",res);
    return 0;
}

3、MT1201强数

强数是各位数字的阶乘和等于原始数的数,输入一个数字N,检查它是否为强数。是则输出YES,否则输出NO。比如145,1!+4!+5!=145

格式

输入格式:

输入为整型

输出格式:

输出为YES或者NO

样例 1

输入:

145

输出:

YES
分析过程

初次分析本题目,第一想法就是首先设置一个count,记录输入数的位数,然后在循环中使用求余与除法结合的方式计算总数,最后使用if语句判断sum与输入数是否相等,如果相等,那么就输出YES,否则,输出NO。

按照以上思路,写出代码:

#include<bits/stdc++.h> 

using namespace std;

int s(int a){
    int sum1 = 1;
    for(int i=1;i<=a;i++){
        sum1 *= i;
    }
    return sum1;
}
int main( )
{
    int n,count=0,sum=0;
    cin >> n;
    int b = n,m = n;
    while(b!=0){ 
        count++;
        b = b/10;
    }
    // cout << count;
    for(int i=1;i<=3;i++){
        int c = n%10;
        sum += s(c);
        n /= 10;
    }
    if(sum == m){
        cout << "YES";
    }else{
        cout << "NO";
    }
    return 0;
}

但是,有一个样例过不去,为什么啊啊啊啊啊啊啊?

所以,开始找错:

有时候,真的对自己挺无语的,一个错误一晚上竟然出现了两次。。没错,就是循环条件那里,没有设置成变量……

修改之后,代码如下: 

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

using namespace std;

int s(int a){
    int sum1 = 1;
    for(int i=1;i<=a;i++){
        sum1 *= i;
    }
    return sum1;
}
int main( )
{
    int n,count=0,sum=0;
    cin >> n;
    int b = n,m = n;
    while(b!=0){ 
        count++;
        b = b/10;
    }
    // cout << count;
    for(int i=1;i<=n;i++){
        int c = n%10;
        sum += s(c);
        n /= 10;
    }
    if(sum == m){
        cout << "YES";
    }else{
        cout << "NO";
    }
    return 0;
}

 

4、MT1203字母矩阵

请编写一个简单程序,输入正整数n,输出n*n的F字矩阵

格式

输入格式:

输入整型

输出格式:

输出n*n的F字矩阵,空格分隔

样例 1

输入:

5

输出:

F F F F F  
F F F F F  
F F F F F  
F F F F F  
F F F F F  
分析过程

我的想法是,循环条件直接输出n*n,然后在能整除n的数上,输出一个换行符。(即使用一个for循环实现)

我实现之后,尝试使用双重循环解决此问题(虽然以前没好好听课,但是还是见过使用双重循环输出矩阵的例子,嘿嘿~)

实现代码

法一:一个for循环实现:

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,count=0;
    cin >> n;
    for(int i=0;i<n*n;i++){
        cout << "F" << " ";
        count++;
        if(count % n == 0 ){
            cout << endl;
        } 
    }
    return 0;
}

法二:使用双重for循环实现

#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,count=0;
    cin >> n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout << "F" << " ";
        }cout << "\n";
    }
    return 0;
}

此题中使用双重for循环也挺简单的,不需要分析内层循环的条件,直接输出即可。

 

明天继续吧。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值