1.阶乘最后的非0位
N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。
个人总结:
1.参考讲解进行的复现,主要考虑之前的溢出问题,根据题目要求用2和5进行计算。
#include<iostream>
using namespace std;
int main()
{
long long num;
int N;
cin>>N;
int count2=0,count5=0;
for(int i=1;i<=N;i++){
int x=i;
while(x%2==0){
count2++;
x=x/2;
}
while(x%5==0){
count5++;
x=x/5;
}
num=(num*x)%100000;
}
int extra=count2-count5;
for(int i=0;i<extra;i++){
num=(num*2)%100000;
}
cout<<num%10<<endl;
return 0;
}
2.最大与最小
明明喜欢玩游戏,而明明的爸爸也乐意陪明明玩各种各样的小游戏。但是在游戏中,明明的爸爸又十分注意培养明明的智力,他希望通过游戏,不仅让明明得到快乐,而且又能让明明学到一些知识,锻炼他的思维能力,为将来的发展打下基础。一天,明明的爸爸和明明做起了一个叫"最大与最小"的游戏,游戏的规则简单但却很有趣,就是有M个整数,构成一个圆环,然后要在这个圆环中找出连续N个相邻的数,目的是要让这N个数的和达到最大或者最小。 例如:一共有5个整数,分别是:1、2、11、4、5,在这5个数中,取连续的3个数,然后我们能够达到的最大值是20(11+4+5),最小值是8(5+1+2)。 明明显然对这个游戏非常感兴趣,但是玩了几次后,明明发现这个游戏又并不是那么容易了,因为随着整数个数的增加,不同的取数方法越来越多,要找到最大最小值的难度就越来越高,到最后明明就变得有些不耐烦了,明明的爸爸发现了这个问题,于是就找到了你,他请你来帮明明一把,写一个程序,把这个环中可能达到的最大最小值找出来,然后告诉明明,而明明只需要找到是哪几个连续的数组成了最大最小值即可,这样可以节约很多的时间。 明明爸爸的问题可以归结为:在一个由M个整数构成圆环中,找出N个相邻的数,使其和为最大或最小。
个人总结:
1.用 (start + i) % M 实现圆环的循环索引,外层循环start从 0 到 M-1:表示连续 N 个数的起始位置;内层循环i从 0 到 N-1:计算从start开始的 N 个数的和。
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
int M, N;
int caseCount = 0;
while (cin >> M >> N) {
if (caseCount > 0) {
cout << endl;
}
caseCount++;
vector<int> nums(M);
for (int i = 0; i < M; i++) {
cin >> nums[i];
}
int maxSum = INT_MIN;
int minSum = INT_MAX;
for (int start = 0; start < M; start++) {
int currentSum = 0;
for (int i = 0; i < N; i++) {
int idx = (start + i) % M;
currentSum += nums[idx];
}
if (currentSum > maxSum) {
maxSum = currentSum;
}
if (currentSum < minSum) {
minSum = currentSum;
}
}
cout << "Max=" << maxSum << endl;
cout << "Min=" << minSum << endl;
}
return 0;
}
3.奇妙的数字
有一种自然数,它的各位数字之和能被17整除。这个数的后继数(即这个数加1)的各位数字之和也能被17整除。求所有自然数中,从小到大第n个这样的数。
个人总结:
1.首先观察末尾数字为9时加1形成的变化,之后进行简化,符合条件的数末尾必须有且仅有 2 个 9,用取模 + 除法遍历每一位,求和后判断是否能被 17 整除。
#include <iostream>
#include <vector>
using namespace std;
int getDigitSum(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
vector<long long> findValidNumbers() {
vector<long long> result;
long long num = 1;
while (result.size() < 10) {
if (num % 100 == 99 && num % 1000 != 999) {
int sum1 = getDigitSum(num);
if (sum1 % 17 != 0) {
num++;
continue;
}
long long nextNum = num + 1;
int sum2 = getDigitSum(nextNum);
if (sum2 % 17 == 0) {
result.push_back(num);
}
}
num++;
}
return result;
}
int main() {
vector<long long> validNums = findValidNumbers();
int n;
while (cin >> n) {
cout << validNums[n-1] << endl;
}
return 0;
}
翻译:
四、计算机科学的主要分支领域
计算机科学可大致分为四个主要领域:软件开发、计算机架构(硬件)、人机交互(设计最高效的人机使用计算机的方式)以及人工智能(试图让计算机具备智能行为)。软件开发涉及创建高效运行的计算机程序。计算机架构则关注为特定计算需求开发最优的硬件。人工智能(AI2)和人机交互这两个领域通常会涉及开发软件和硬件以解决具体问题。
- 软件开发
在开发计算机软件的过程中,计算机科学家和工程师会研究软件设计的各个领域及相关技术,例如最优化的设计方法,在特定程序中应使用的编程语言和算法类型、如何高效地存储和检索信息,以及某些软件与计算机组合的计算限制。软件设计师在开发程序时必须考虑许多因素。通常,为了保证软件的整体性能,某个方面的程序性能必须做出牺牲。例如,由于计算机的内存有限,软件设计师必须限制程序中包含的功能数量,以免程序所需的内存超出其设计所依赖的系统所能提供的范围。
软件工程是软件开发领域的一个分支,计算机科学家和工程师在此领域研究能够促进高效编写正确、可靠且稳健的计算机程序的方法和工具。计算机科学这一分支领域的研究涵盖了软件生命周期的所有阶段,从正式的问题描述开始,依次经过解决方案的设计、程序的实现、程序的测试以及程序的维护。软件工程师会开发软件工具以及被称为编程环境的工具集合,以优化开发过程。例如,这些工具能够帮助管理由程序员团队编写的大规模程序中的众多组件。
