练习题
1
答案
cpp
复制代码
#include <stdio.h>
int main() {
int m;
scanf("%d", &m);
int k = 2;
while (k <= m && (m % k))
/************found************/
k++;
/************found************/
if (m == k )
printf("YES\n");
else
printf("NO\n");
return 0;
}
注意事项
注意/found /下面才是需要修改的行。
注意错误也可能是符号之类的,不一定是思路。
11
答案
cpp
复制代码
#include <stdio.h>
#define SIZE 100
int main() {
double s[SIZE], w[SIZE / 5];
int i, k, n;
double sum;
scanf("%d", &n);
for (k = 2, i = 0; i < n; i++) {
s[i] = k;
/**********found**********/
k+=2;
}
sum = 0.0;
for (k = 0, i = 0; i < n; i++) {
sum += s[i];
/**********found**********/
if ((i+1)%5 == 0) {
w[k] = sum / 5;
/**********found**********/
sum=0;
k++;
}
}
for (i = 0; i < k; i++)
printf("%6.2f ", w[i]);
return 0;
}
注意事项
21
答案
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
//将一个正整数N(1<N<32768)分解质因数。例如,输入90,打印出90=2*3*3*5。
int main(){
int N;
cin>>N;
cout<<N<<"=";
bool first=true;
for(int i=2;i*i<=N;i++){
while(N%i==0){
if(!first){
cout<<"*";
}
first=false;
cout<<i;
N/=i;
}
}
if(N>1){//刚好除尽则剩余1
if(!first){
cout<<"*";
}
first=false;
cout<<N;
}
cout<<endl;
return 0;
}
注意事项
注意这里使用的是N/=i;进行循环,那么最后正好整除的话N==1。
31
答案
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
//对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。
//这个集合包括,p1, p1p2(即p1乘以p2), p1p3, 和 p1p2p3 (还有其它很多)。
//这是个对于一个集合S的丑数集合。注意:我们不认为1 是一个丑数。
//你的工作是对于输入的集合S去寻找集合中的第N个丑数。
//说明:结果不超过32位整数能表示的范围
//比如:S={2, 3, 5, 7}
//则前15个丑数为:
//2,3,4,5,6,7,8,9,10,12,14,15,16,18,20
int main(){
int K,N;
cin>>K>>N;
vector<int> S(K);
vector<int> Idx(K,0);
vector<int> Ans;
for(int i=0;i<K;i++){
cin>>S[i];
}
Ans.push_back(1);
for(int i=1;i<=N;i++){
int min=INT_MAX;
for(int j=0;j<K;j++){
int t=Ans[Idx[j]]*S[j];
if(t<min){
min=t;
}
}
Ans.push_back(min);
for(int j=0;j<K;j++){
if(Ans[Idx[j]]*S[j]==min){
Idx[j]++;
}
}
}
cout<<Ans[N]<<endl;
return 0;
}
注意事项
注意这题不能暴力枚举,会超时。
这题主要是进行索引的变化,只需要每次比较出能乘质数数组出最小的Ans数组中的值,将这个对应的数往后排。
bash
复制代码
示例演示
输入
4 15
2 3 5 7
意思是:
K = 4,有 4 个素数
N = 15,求第 15 个丑数
素数集合:
𝑆
=
{
2
,
3
,
5
,
7
}
S={2,3,5,7}
我们用到的数组
1)素数数组 p[]
p = [2, 3, 5, 7]
2)丑数数组 a[]
a[i] 表示第 i 个丑数。
注意:
a[0] = 1
这里的 1 只是辅助起点,不算丑数。
所以真正的第 1 个丑数是以后生成出来的 a[1]。
3)指针数组 idx[]
idx = [0, 0, 0, 0]
它表示:
2 现在乘 a[0]
3 现在乘 a[0]
5 现在乘 a[0]
7 现在乘 a[0]
也就是一开始都从 1 开始乘。
初始状态
a[0] = 1
idx = [0, 0, 0, 0]
第 1 轮:求第 1 个丑数
当前候选值:
2 × a[0] = 2 × 1 = 2
3 × a[0] = 3 × 1 = 3
5 × a[0] = 5 × 1 = 5
7 × a[0] = 7 × 1 = 7
最小值是:
2
所以:
a[1] = 2
谁生成了 2?
只有:
2 × a[0]
所以把 2 对应的指针后移:
idx = [1, 0, 0, 0]
第 2 轮:求第 2 个丑数
当前候选值:
2 × a[1] = 2 × 2 = 4
3 × a[0] = 3 × 1 = 3
5 × a[0] = 5 × 1 = 5
7 × a[0] = 7 × 1 = 7
最小值是:
3
所以:
a[2] = 3
谁生成了 3?
只有:
3 × a[0]
所以:
idx = [1, 1, 0, 0]
第 3 轮:求第 3 个丑数
当前候选值:
2 × a[1] = 4
3 × a[1] = 6
5 × a[0] = 5
7 × a[0] = 7
最小值:
4
所以:
a[3] = 4
谁生成了 4?
只有:
2 × a[1]
所以:
idx = [2, 1, 0, 0]
41
答案
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int k,N;
cin>>k>>N;
vector<int> Ans;
int t=1;
while(Ans.size()<N){
Ans.push_back(t);
int s=Ans.size()-1;
for(int j=0;j<s;j++){//注意Ans.size()一直在变化
Ans.push_back(t+Ans[j]);
}
t*=k;
}
cout<<Ans[N-1]<<endl;
return 0;
}
注意事项
注意Ans.size()一直在变化。
注意循环中的顺序问题。
51
答案
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
/*有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。*/
int main(){
int N;
cin>>N;
vector<int> Kid(N);
for(int i=0;i<N;i++){
cin>>Kid[i];
}
bool equal=false;
int ans=0;
while(!equal){
for(int i=0;i<N;i++){
if(Kid[i]%2!=0){
Kid[i]++;
ans++;
}
}
vector<int> half(N,0);
for(int i=0;i<N;i++){
half[i]=Kid[i]/2;
}
for(int i=0;i<N;i++){
Kid[i]=half[i]+half[(i+N-1)%N];
}
int eq=Kid[0];
bool equ=true;
for(int i=1;i<N;i++){
if(eq!=Kid[i]){
equ=false;
break;
}
}
if(equ){
equal=true;
}
}
cout<<ans<<endl;
return 0;
}
注意事项
英语翻译
近几年大约模型已经在人工智能领域成为了一个重要的研究方向,这些模型通常以Transformer架构为基础,并且通过大量的文本数据及进行训练。通过学习语言中的数据模式,大语言模型能够执行多样的任务,例如文本生成问题回答以及机器翻译。随着模型尺寸持续的增加,大语言模型在许多自然语言处理任务中已经可以表现的接近或者甚至超过人类的水平。然而训练和部署这样巨大的模型要求巨大的计算资源,这导致了有关能源消耗和成本的担忧,因此提升模型性能已经成为了一个重要的研究要点。
单词打卡