超算第一轮考核任务
超算第一轮考核任务
第一个任务
考察了最基本的c++的输入输出格式,还挺好弄的
/*
输入个人信息并输出;
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int number;
string name,profession,sex;
cout<<"请输入你的学号:"<<endl;
cin>>number;
cout<<"请输入你的姓名:"<<endl;
cin>>name;
cout<<"请输入你的专业:"<<endl;
cin>>profession;
cout<<"请输入你的性别:"<<endl;
cin>>sex;
cout<<"你的学号是:"<<"\t"<<number<<endl;
cout<<"你的姓名是:"<<"\t"<<name<<endl;
cout<<"你的专业是:"<<"\t"<<profession<<endl;
cout<<"你的性别是:"<<"\t"<<sex<<endl;
return 0;
}
第二个任务
加入c++中的判断语句和逻辑运算
/*
判断是否是闰年;
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int year;
cout<<"请输入年份:";
cin>>year;
if((year%4==0 && year%100!=0) || year%400==0)
{
cout<<year<<"是闰年";
}
else cout<<year<<"不是闰年";
return 0;
}
第三个任务
加入循环语句,但不清楚是不是我想的“反转”
/*
数字的反转;
如果我想的没错的话,目的应该是指的在视觉上的反转吧
例如:700 变成 007;
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int number,digit;
cout<<"请输入一个数用于反转:"<<endl;
cin>>number;
cout<<"反转的结果为:";
while(number>0)
{
digit=number%10;
number/=10;
cout<<digit;
}
return 0;
}
第四个任务
出现算法的内容
/*
给出两个数的最大公约数和最小公倍数;
最大公约数我用的是辗转相除法;
而最小公倍数用两数相乘再除最大公约数即可;
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x1,y1,x2,y2,min,max,temp=1; //不让其一开始就等于0;
cout<<"输入两个数,我们将得到它们的最小公倍数:";
cin>>x1>>y1;
x2=x1;
y2=y1;
while(temp != 0)
{
temp=x2%y2;
x2=y2;
y2=temp;
}
max=x2;
min=x1*y1/max;
cout<<"最小公倍数为:"<<min<<endl;
cout<<"最大公约数为:"<<max<<endl;
return 0;
}
第五个任务 第一种方法
开始接触函数
/*
比较传统的写了个函数,来用于判断是否为素数;
*/
#include<bits/stdc++.h>
#include<math.h>
#define MAXLEN 1001
using namespace std;
int prime(int number);
int main()
{
int a[MAXLEN],i;
cout<<"1000以内的素数有:" <<endl;
for(i=2;i<MAXLEN;i++)
{
if(prime(i) == 1)
{
cout<<i<<"\t";
}
}
return 0;
}
int prime(int number)
{
int tap;
for(tap=2;tap<=sqrt(number);tap++)
{
if(number%tap == 0) return 0;
}
return 1;
}
第五个任务 第二种方法
不知道是不是错觉,我感觉用筛法比上面的传统算法更麻烦,因为就算是最好的筛也会遍历一遍数组(就是线性筛),所以在这个问题上我认为用筛法只是更难理解了,没什么好处
/*
用了埃氏筛解决1000内的素数;
*/
#include<bits/stdc++.h>
#define MAXLEN 1001
using namespace std;
int main()
{
int prime_number[MAXLEN],x,i;
cout<<"1000以内的素数有:" <<endl;
for(i=0;i<MAXLEN;i++)
{
prime_number[i]=1; //全部初始化为 1 用于判断2是否为素数;
}
for(i=2;i<=MAXLEN;i++)
{
if(prime_number[i])
{
for(x=2;i*x<MAXLEN;x++)
{
prime_number[i*x]=0;
}
}
if(prime_number[i] == 1) cout<<i<<"\t";
}
return 0;
}
第六个任务 用了纯数学公式,n的阶乘太大,内存爆了
看来不能只用数学思维(人的方式)的方式直接去解题 😅
/*
一个有n层的杨辉三角图
这是我第一次的想法,纯属用数学公式进行计算,内存直接被n的阶乘给弄爆了 ...... (lll¬ω¬);
n最大只能到20;
*/
#include<bits/stdc++.h>
using namespace std;
int combination(int n,int m);
unsigned long long factorial(int n);
int main()
{
int x,n,m;
cout<<"请输入一个正整数n表示杨辉三角的层数:";
cin>>x;
for(n=0;n<x;n++)
{
for(m=0;m<=n;m++)
{
cout<<combination(n,m)<<" ";
if(m == n) cout<<"\b\n";
}
}
return 0;
}
int combination(int n,int m)
{
int sum;
sum=factorial(n)/(factorial(m)*factorial(n-m));
return sum;
}
unsigned long long factorial(int n)
{
unsigned long long i,sum=1;
for(i=2;i<=n;i++)
{
sum*=i;
}
return sum;
}
第六个任务 换了一种想法,用递归算法,时间复杂度太高,还是爆了
思考:题目没有给层数的范围,当层数过大时就算是unsigned long long 也装不下
😅
/*
改进后的杨辉三角图;
这次我用的是递归算法,想不让内存炸,结果时间复杂度有奇高 ......害;
我感觉位置不是很好调到后面,而且就算你用手去画图也是会歪的,所以我就没去调位置;
*/
#include<bits/stdc++.h>
long long location(int hang,int lie);
using namespace std;
int main()
{
int hang,lie,x;
cout<<"请输入一个正整数n表示杨辉三角的层数:";
cin>>x;
for(hang=1;hang<=x;hang++)
{
for(lie=0;lie<hang;lie++)
{
cout<<location(hang,lie)<<" ";
if(lie == hang-1) cout<<"\n";
}
}
return 0;
}
long long location(int hang,int lie)
{
if(hang == 1) return 1;
else if(lie == 0 || lie == hang-1) return 1;
else
{
return location(hang-1,lie)+location(hang-1,lie-1);
}
}
第六个任务 最终版
加上了剪枝的递归
/*
剪枝后的递归算法;
建一个数字列表,通过一个全局变量实现,在处理50的层数时依然快速;
*/
#include<bits/stdc++.h>
long long location(int hang,int lie);
using namespace std;
long long yanghui[999][999];
int main()
{
int hang,lie,x;
cout<<"请输入一个正整数n表示杨辉三角的层数:";
cin>>x;
for(hang=1;hang<=x;hang++)
{
for(lie=0;lie<hang;lie++)
{
yanghui[hang][lie]=location(hang,lie);
cout<<location(hang,lie)<<" ";
if(lie == hang-1) cout<<"\n";
}
}
return 0;
}
long long location(int hang,int lie)
{
int temp;
if(hang == 1)
{
yanghui[1][0]=1;
return 1;
}
else if(lie == 0 || lie == hang-1)
{
yanghui[hang][0]=1;
yanghui[hang][lie]=1;
return 1;
}
else
{
return yanghui[hang-1][lie]+yanghui[hang-1][lie-1];
}
}
第七个任务
两个判断的函数加在一起就可以了,跟上面的一样;
/*
判断是否为质数回文数;
回文数 && 素数就可以,两个函数;
*/
#include<bits/stdc++.h>
#define MAX 99999
using namespace std;
int prime_number(int number);
int palindromic_number(int number);
int main()
{
int tap,x;
cout<<"请输入一个正整数:";
cin>>x;
if(prime_number(x) && palindromic_number(x)) cout<<"这是一个质数回文数";
else cout<<"这不是一个质数回文数";
return 0;
}
int prime_number(int number)
{
int i;
for(i=2;i<=sqrt(number);i++)
{
if(number%i == 0) return 0;
}
return 1;
}
int palindromic_number(int number)
{
int i,length=0,a[MAX];
for(i=0;number>0;i++)
{
a[i]=number%10;
number/=10;
length++;
}
for(i=0;i<length;i++)
{
if(a[i] != a[length-1-i]) return 0;
}
return 1;
}
第八个任务
任务涉及到文件的调用,c语言里有stdlib.h库可实现
fopen 打开文件;fputc写入一个字符,fgetc读入一个字符,fputs写入一个字符串,fgets读入一个字符串;
/*
用于检索一篇英语短文中的英语单词的个数;
我实现的是将短文放在一个文件里,输入文件名即可对单词查找
但注意短文的格式要正规;
*/
#include<bits/stdc++.h>
#include<stdio.h>
#include<stdlib.h>
#define swap(a,b){char tmp;tmp=a;a=b;b=tmp;}
main() {
FILE *fg;
char find[20]={'\0'};
char word_in[20]={'\0'};
char name[100]={'\0'};
char ch;
int sum=0;
int flag,test=1;
printf("请输入你要检索的文件名:\n");
scanf("%s",name); //用于变量的声明和文件名的输入;
if((fg=fopen(name,"r")) == NULL)
{
printf("该文件名不正确,无法打开!");
exit(0);
}
else
{
printf("放入你要搜索的短文到文件中\n");
printf("请输入你要查找的单词:\n");
scanf("%s",find);
getchar();
} //用于判断文件是否打得开;
while(1)
{
for(int i=0;i<20;i++){
ch=fgetc(fg);
if(ch==' ' || ch=='\n')break;
if(ch == EOF){
printf("在文章中一共查找到%d个%s",sum,find);
return 0;
}
word_in[i]=ch;
} //逐个输入单词,判断到空格就认为是一个单词,break,....,再判断下一个单词直到读到终止符;
for(int i=0;i<20;i++)
{
if(find[i] != word_in[i])
{
test=0; //判断单词是否匹配;
break;
}
} //判断是否与find相同;
if(test)
{
sum++;
} //统计单词个数;
for(int i=0;i<20;i++){
word_in[i]='\0';
}
test=1; //初始化word_in 和 test;
}
}
第九个任务
学习数据结构,知道栈有入栈,出栈,查栈顶,清空栈的功能;
类的思想和结构体十分的相似,只是类多了private 和 public 的功能,对于解决一类问题的变量和函数的管理可以更加完善,我的感受就想是一个工具箱,想要什么自己先造,,然后再调用,方便
/*
用类的方法模拟栈的功能(只去实现了压栈、出栈、看站内元素的个数、可自定义栈的大小)
*/
#include<iostream>
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
class _stack
{
private:
int *sta; //sta表示的栈名;
int stack_top=-1; //表示栈顶
int top;
int depth=0; //是否到达栈地的开关;
public:
void setin_length(int x);// 输入栈的大小;
void setin_sta(int st);//用于输入栈中的每一个元素;
void setout();//用于输出栈内元素;
void set_length();//用于输出栈的长度;
int is_full();//用于判断是否满栈;
int is_blank(); //用于判断是否空栈;
};
void _stack::setin_length(int x)
{
sta=(int *)calloc(x,sizeof(int));//动态地址分配;
top=x-1;
}
void _stack::setin_sta(int st)
{
stack_top++;
sta[stack_top]=st;
}
void _stack::setout()
{
cout<<sta[stack_top]<<endl;
sta[stack_top]=0;
if(stack_top == -1){}
else
stack_top--;
}
void _stack::set_length()
{
cout<<stack_top+1<<endl;
}
int _stack::is_full()
{
if(stack_top == top) return 1;
else return 0;
}
int _stack::is_blank()
{
if(stack_top == -1 )
return 1;
else return 0;
}
int main()
{
string str;
_stack kit;
int length;
int ch;
cout<<"please set down the length of your stack:(option:'push','pop','sizeof')"<<endl;
cin>>length;
kit.setin_length(length);
while(1)
{
cin>>str;
if(str == "push")
{
if(kit.is_full())
{
cout<<"The stack is full"<<endl;
}
else
{
getchar();
cin>>ch;
kit.setin_sta(ch);
}
}
if(str == "pop")
{
if(kit.is_blank())
{
cout<<"Nothing in the stack"<<endl;
}
else
kit.setout();
}
if(str == "sizeof")
{
kit.set_length();
}
if(str == "over") return 0;
}
}
第十个任务 用指针完成的交换
c++中的指针就是c语言中的指针,一摸一样
/*
用指针交换数字实现排序
*/
#include<stdio.h>
#include<iostream>
#define MAXLEN 99999
using namespace std;
void _swap(int *x,int *y);//怕c++自带的swap影响;
int main()
{
int j,i,n,a[MAXLEN];
cout<<"请输入要排列数字的个数:"<<endl;
cin>>n;
cout<<"请输入一些数"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j+1]<a[j]) _swap(&a[j+1],&a[j]);
}
}
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
void _swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
第十个任务 用引用完成的交换
心得:c++的引用功能跟c语言的指针十分相似,只是指针存放的是一个变量的地址值,而c++的引用是变量的另一个名字。但从本质上来讲我认为指针和引用应该原理上是一样的,引用只是指针的应用包装在一起的,而且一个引用变量所能够引用的变量只有一个,而我的swap的函数中之所以能够用到对a[]的多次利用是因为每次调用函数时,x,y 的变量的地址一直都在变,也就是x,y其实是两个不同的变量,才能够多次的引用;
/*
用引用实现数字交换,排序;
*/
#include<bits/stdc++.h>
#define MAXLEN 99999
using namespace std;
void _swap(int &x,int &y); //怕c++自带的swap影响;
int main()
{
int j,i,n,a[MAXLEN];
cout<<"请输入要排列数字的个数:"<<endl;
cin>>n;
cout<<"请输入一些数"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j+1]<a[j])
{
_swap(a[j+1],a[j]);
}
}
}
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
void _swap(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现