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循环也挺简单的,不需要分析内层循环的条件,直接输出即可。
明天继续吧。