超算第一轮考核任务

超算第一轮考核任务

第一个任务

考察了最基本的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;	
} 
posted @   MITE's_BKY  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示