n诺1041-1060

这篇博客包含了一系列编程题目,涵盖了数学计算、算法和逻辑推理等多个方面,例如最大公约数与最小公倍数、阶乘和、平方和与倒数和的计算,以及猴子吃桃问题、完数寻找、迭代平凡根等经典问题。此外,还包括学生成绩管理、日期计算、矩阵相乘和数字模式识别等实际应用问题。
摘要由CSDN通过智能技术生成

1041 最大公约数 最小公倍数
求两个数的最大公约数和最小公倍数

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

int gcd(int a, int b)
{
	if (b == 0)
		return a;
	else
		return gcd(b, a%b);
}
int main()
{
	int m, n;
	cin >> m >> n;
	cout << gcd(m, n) << " " << n * m / gcd(m, n) << endl;
	return 0;
}

1042 字符个数
输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

int main()
{
	string s;
	while (getline(cin, s))
	{
		int i = 0;
		int digit = 0, letter = 0, space = 0, other = 0;
		for (i = 0; i < s.size(); i++) {
			if (s[i] >= '0'&&s[i] <= '9')
				digit++;
			else if (s[i] >= 'a'&&s[i] <= 'z' || s[i] >= 'A'&&s[i] <= 'Z')
				letter++;
			else if (s[i] == ' ')
				space++;
			else
				other++;
		}
		cout << letter << " " << digit << " " << space << " " << other << endl;
	}
	return 0;
}

1043计算Sn
求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。 例如:2+22+222+2222+22222(n=5),

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

int main()
{
	int a, n, i;
	double sum = 0, t;
	cin >> a >> n;
	t = a;
	for (int i = 1; i <= n; i++)
	{
		sum = sum + t;
		t = t * 10 + a;
	}
	cout << sum << endl;
	return 0;
}

1044阶乘和
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

long fun(int n)
{
	if (n == 1)
		return 1;
	else
		return fun(n - 1)*n;
}
int main()
{
	int n;
	cin >> n;
	long sum = 0;
	for (int i = 1; i <= n; i++)
		sum = sum + fun(i);
	cout << sum << endl;
	return 0;
}

1045 平方和与倒数和
求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和

#include<iostream>
using namespace std;
int main()
{
    int a,b,c;
    double sum=0;
    cin>>a>>b>>c;
    for(int i=1;i<=a;i++){
        sum+=i;
    }
    for(int i=1;i<=b;i++){
        sum+=i*i;
    }
    for(double i=1;i<=c;i++){
        sum+=1/i;
    }
    printf("%.2f",sum);
}

1046完数
一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子:

#include<iostream>
//#include<iomanip>
using namespace std;
void fun(int n)
{
	int i,sum;
	for(i=2;i<=n;i++)
	{
		sum=0;
		for(int j=1;j<=i/2;j++)
		{
			if(i%j==0)
			{
				sum=sum+j;
			}
		}
		if(sum==i)
			{
				cout<<i<<" its fastors are ";
				for(int k=1;k<=i/2;k++)
				{
					if(i%k==0)
					{
						cout<<k<<" ";
					}
				}
				cout<<endl;
			}
	}
}
int main()
{
	int n;
	cin>>n;
	fun(n);
	cout<<endl;
	return 0;
}

1047 分数求和
有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前N项之和,保留两位小数。

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;


int main()
{
	int n;
	cin >> n;
	double sum = 0, t, j = 2,k=1;
	double temp;
	for (double i = 1; i <= n; i++)
	{
		t = j / k;
		sum = sum + t;
		temp = j + k;
		k = j;
		j = temp;
	}
	printf("%.2lf\n", sum);
	return 0;
}

1048 自由落体
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int m, n;
	cin >> m >> n;
	double num = m, sum = -m;
	for (int i = 1; i <= n; i++) {
		sum += num * 2.0;
		num /= 2.0;
	}
	printf("%.2f %.2f\n", num, sum);
	return 0;
}

1049 猴子吃桃
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

int main()
{
	int n, j=1;  //第n天早上1个桃子
	cin >> n;
	for (int i = 1; i < n; i++)
	{
		j++;
		j = j * 2;
	}
	cout << j << endl;
	return 0;
}

1050 迭代平凡根
用迭代法求 。求数字a平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。 输出保留3位小数

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
	int x;
	double n;
	cin>>x;
	n=sqrt(x);
	cout<<setiosflags(ios::fixed)<<setprecision(3)<<n<<endl;
	return 0;
}

1051 日期计算
定义一个结构体变量(包括年、月、日),编程序,要求输入年月日,计算并输出该日
在本年中第几天。

#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

struct Date
{
	int year, month, day;
};
bool isyear(int year)
{
	if (year % 400 == 0 ||( year % 4 == 0 && year % 100 != 0))
		return true;
	return false;
}
void fun()
{
	int tab[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	Date d;
	int days = 0;
	while (cin >> d.year >> d.month >> d.day)
	{
		days = 0;
		if (d.month <= 0 || d.month > 12 || d.day <= 0 || d.day > tab[d.month])
			cout << "Input error!" << endl;
		else {
			for (int i = 1; i < d.month; i++)
				days = days + tab[i];
			if (isyear(d.year) && d.month > 2)
				days++;
			days += d.day;
			cout << days << endl;
		}
	}
}
int main()
{
	fun();
	return 0;
}

1052 学生成绩管理
有N个学生,每个学生的数据包括学号、班级、姓名、三门课成绩。从键盘输入N 个
学生数据,要求打印出每个学生三门课的平均成绩,以及平均分最高分学生数据(包括学号、
班级、姓名、三门课成绩,平均分)。
要求:
1、 定义学生结构体。
2、 用一个函数实现N 个学生数据的输入,用另一个函数负责求每个学生三门课程的平
均成绩,再用一个函数求出平均分最高的学生并输出该学生的数据。要求平均分和平均分最
高的学生数据都在主函数中输出。

#include <iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#define N 100
using namespace std;

struct Stu {
	string num;
	string clas;
	string name;
	float score[3];
}stu[N];
float average[N];
void input(int n) {
	for (int i = 0; i < n; i++)
		cin >> stu[i].num>>stu[i].clas>>stu[i].name>>stu[i].score[0]>>stu[i].score[1]>>stu[i].score[2];
}
void fun2(int n)
{
	int max = 0,m=0;
	for (int i = 0; i < n; i++)
	{
		average[i] = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3;
		if (average[i] > max)
		{
			max = average[i];
			m = i;
		}
	}
	for (int i = 0; i < n; i++)
	{
		cout<<setiosflags(ios::fixed)<<setprecision(1) << stu[i].name << " " << average[i] << endl;
	}
	cout << setiosflags(ios::fixed) << setprecision(1)<<stu[m].num << ' ' << stu[m].clas << ' ' << stu[m].name << ' ' <<  stu[m].score[0] << ' ' << stu[m].score[1] << ' ' << stu[m].score[2] << ' ' << average[m] << endl;
}
int main()
{
	int n;
	cin >> n;
	input(n);
	fun2(n);
	return 0;
}


1053 偷菜时间
假设当前时间为13:15,第一行输入作物种类数n,
从第二行开始输入n 种作物成熟需要的时间,格式为
Hour:Minute。


#include <iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#define N 100
using namespace std;


int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int a, b;
		char mid;
		cin >> a >> mid >> b;
		int oa = 13, ob = 15;
		if ((ob = ob + b) >= 60)
		{
			ob = ob - 60;
			oa++;
		}
		oa += a;
		cout << oa % 24 << mid << ob << endl;
	}
	return 0;
}

1055矩阵相乘
输出一个大小为3*3的距阵,矩阵每一行相邻的的两个数字之间由一个空格隔开。具体的请详见 Sample Output

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
	int a[3][3],b[3][3],c[3][3],i,j;
	for(i=0;i<3;i++)
		for(j=0;j<3;j++)
			cin>>a[i][j];
	for(i=0;i<3;i++)
		for(j=0;j<3;j++)
			cin>>b[i][j];
	int m,n,k;
	int sum=0;
	for(m=0;m<3;m++)
	{
		for(n=0;n<3;n++)
		{
			for(k=0;k<3;k++)
			{
				sum=sum+a[m][k]*b[k][n];
			}
			c[m][n]=sum;
			sum=0;
		}
	}
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
			cout<<c[i][j]<<' ';
		cout<<endl;
	}
	cout<<endl;
	return 0;
}

1057 数字模式的识别
数字的模式是指在一堆给定数字中出现次数最多的数值,如5,5,5,3,3,2,6,4,它的模式就是5。现在你的任务,就是从数字中找到它的模式.

#include <iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#define N 100
using namespace std;

long a[2000000] = { 0 };
int main()
{
	long b[100];
	int n, temp;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> b[i];
		a[b[i]]++;
	}
	int max = 0;
	for (int i = 0; i < n; i++)
	{
		if (a[b[i]] > a[b[max]])
			max = i;
	}
	cout << b[max] << endl;
	return 0;
}

1058 求组合数
输入n 和r 的值; 当用户输入0 0 时,程序结束。
输出描述:
根据公式: C(n,r) = C(n, r-1) * (n - r + 1) / r 输出运算结果 输入数据不满足题意时候,输出"error!"

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int fun(int n,int r)
{
	if(r==1)
		return n;
	return 
		fun(n,r-1)*(n-r+1)/r;
}

int main(){
	int a,b;
	cin>>a>>b;
	while(a!=0||b!=0)
	{
		if(a<b)
			cout<<"error!"<<endl;
		else
		{
			if(b==0)
			{
				cout<<1<<endl;
			}
			else
				cout<<fun(a,b)<<endl;
		}
		cin>>a>>b;
	}	
	return 0;
}

1059 阶乘问题
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600 12的阶乘最右边的非零位为6。 写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。 注意:10,000,000!有2499999个零。

#include <iostream>

using namespace std;


int f(long long n) {
	while(n%10==0) n /= 10;
	return n%1000000000;
}

int main() {
	
	long long n,ans;
	while(~scanf("%lld", &n)) {
		ans = 1;
		for (int i = 1; i <= n; i++) {
			ans *= i;
			ans = f(ans);
		}
		cout << ans%10 << endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值