顺序表ADT模板设计及简单应用:找匹配
时间限制: 1s
类别: DS:线性表->线性表应用
晚于 2024-05-08 23:59:00 后提交分数乘系数50%
截止日期:2024-05-11 23:59:00
问题描述
目的:使用自行设计的顺序表ADT或STL的vector模板设计并实现顺序表应用场合的一些简单算法设计。
应用8:假设有一个整数类型的顺序表(假定为非空表),元素取值可能是1~N(10<=N<=100000)中的任意一个数,相同数值不会重复出现。试设计一个算法,用O(n)的时间复杂度将找出顺序表中符合条件的数对的个数,满足数对中两数的和等于N+1。
(1)顺序表ADT版本
参考函数原型:
template<class ElemType>
int getCount(SqList<ElemType> &A, int N);
(2)vector版本
参考函数原型:
template<class ElemType>
int getCount(vector<ElemType> &A, int N);
函数形参:
A: 整数类型的顺序表,其元素取值可能是1~N(10<=N<=100000)中的任意一个数
N: 在A中,查找两个数的和等于N+1的对数
函数返回值:
返回统计结果
输入说明
第一行:整数N,表示给定的N值。
第二行:顺序表的数据元素(取值可为1~N中的任意一个数),以空格分隔
输出说明
第一行:顺序表A的遍历结果,以“,”分隔。
空行
第二行:统计结果
#include <iostream>
#include <vector>
#include <map>
using namespace std;
#define MAXSIZE 100;
typedef int Status; //Status 鏄嚱鏁拌繑鍥炲�肩被鍨嬶紝鍏跺�兼槸鍑芥暟缁撴灉鐘舵�佷唬鐮併��
template<class ElemType>
class Sqlist {
private:
vector <int> elem;
int length;
public:
Sqlist()
{
length = 0; int num = 0;
while (cin >> num) {
elem.push_back(num);
length++;
}
}
int search(int num)
{
vector <int> A(elem);
vector <int> S(num+1, 0);
int sum = 0;
typename std::vector<ElemType>::iterator iter = A.begin();
while (iter != A.end()){
S[ * iter] = 1;
iter++;
}
iter = A.begin();
while (iter != A.end()){
int n = num + 1 - *iter;
S[*iter] = 0;
if (S[n] == 1) {
S[n] = 0;
sum++;
}
iter++;
}
return sum;
}
void traverse()
{
typename std::vector<ElemType>::iterator iter = elem.begin();
while (iter != elem.end()) {
cout << *iter;
if ((iter + 1) != elem.end()) cout << ",";
iter++;
}
}
};
int main()
{
int n, num = 0;
cin >> n;
Sqlist <int> S;
S.traverse();
cout << endl << endl;
num=S.search(n);
cout << num;
return 0;
}
阿姆斯特朗数
时间限制: 1s
类别: DS:线性表->线性表应用
晚于 2024-05-08 23:59:00 后提交分数乘系数50%
截止日期:2024-05-11 23:59:00
问题描述
内容:在指定范围[m,n]的所有整数中,试设计一算法找出所有的Armstrong数。
Armstrong数:如果一个k位正整数等于其各位数字的k次方之和,则称该数为阿姆斯特朗数。
例如,在三位(k=3)的整数中,153可以满足13 + 53 + 33 = 153,这样的数称之为Armstrong数。
参考函数原型:
void findArmstrong(int m, int n, vector<int> &Armstrong);
约定:
1<=m<=n<=100000
输入说明
输入两个整数m、n,以空格分隔,表示指定范围为[m,n],需要找出该范围内的所有Armstrong数
输出说明
第一行:如果:没有ArmStrong数,输出“null”
否则:指定范围内所有的ArmStrong数(升序排列,以“,”分隔)
#include <iostream>
using namespace std;
const int N=100000;
int a[N];
bool armstrong(int n)
{
int p=0,m=n;
int b[7]={0};
while(m>0)
{
p++;
b[p]=m%10;
m/=10;
}
int sum=0;
for(int i=1;i<=p;i++)
{
int num=1;
int q=p;
while(q--) num*=b[i];
sum+=num;
}
if(sum==n) return 1;
else return 0;
}
int main()
{
int m,n;
cin>>m>>n;
int k=0;
for(int i=m;i<=n;i++)
{
if(armstrong(i))
{
k++;
a[k]=i;
}
}
if(k==0) cout<<"null"<<endl;
else
{
for(int i=1;i<k;i++)
cout<<a[i]<<",";
cout<<a[k]<<endl;
}
return 0;
}
单链表ADT模板应用算法设计:长整数加法运算(不使用单链表存储计算结果)
时间限制: 1s
类别: DS:线性表->线性表应用
晚于 2024-05-08 23:59:00 后提交分数乘系数50%
截止日期:2024-05-11 23:59:00
问题描述
目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上ÿ