PAT基础编程题目集(完)----函数题

这里面很多题都非常简单非常基础,算法不止一个,这种基础题不用要求太严格,能过就行。

//数字 乘以 数组保存的数字 的方法。
int Special_Multiplication(int num[], int top, int x) {
	int flag = 0;
	for (int i = 0; i <= top; i++)
	{
		int tem = num[i] * x + flag;
		num[i] = tem % 10;
		flag = tem / 10;
		if (i == top)
		{
			//最后一位的时候,循环取出每一位。
			while (flag != 0)
			{
				num[++top] = flag % 10;
				flag /= 10;
			}
			return top;
		}
	}
}
//阶乘计算升级版
void Print_Factorial(const int N) {
	if (N < 0) {
		printf("Invalid input");
		return;
	}
	else if(N<=1) {
		printf("1");
	}
	else {
		int num[3001] = { 0 };
		int top = 0;
		num[0] = 1;
		for (int i = 2; i <= N; i++)
		{
			top = Special_Multiplication(num, top, i);
		}
		for (int i = top; i >=0 ; i--)
		{
			printf("%d", num[i]);
		}
	}
}

上面的这道题我写了个工具方法,用数组存储运算好像挺常见的。

//统计个位数字
int Count_Digit(const int N, const int D) {
	if (N == 0 && D == 0) {
		return 1;
	}
	int num = N;
	if (N < 0) {
		num = -N;
	}
	int current = 0;
	int tag[10] = { 0 };
	while (num)
	{
		current = num % 10;
		num /= 10;
		tag[current]++;
	}
	return tag[D];
}
//简单阶乘计算
int Factorial(const int N) {
	int result = 1;
	if (N < 0) {
		return 0;
	}
	else if (N < 2) {
		return 1;
	}
	else {
		for (int i = 2; i <= N; i++)
		{
			result *= i;
		}
	}
	return result;
}
//统计某类完全平方数
int IsTheNumber(const int N) {
	//看是不是完全平方数
	int flag = 0;
	for (int i = 1; i < N / 3; i++)
	{
		//这里不用双精度的话121和122都会算成完全平方数
		if (N*1.0 / i == i) {
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		return 0;
	}
	//看是不是有两位相等
	flag = 0;
	int num = N;
	int current = 0;
	int tag[10] = {0};
	while (num)
	{
		current = num % 10;
		num /= 10;
		if (tag[current]!=1)
		{
			tag[current] = 1;
		}
		else {
			flag = 1;
			break;
		}
	}
	return flag;
}
//求单链表节点的阶乘和
int FactorialSum(List L) {
	int sum = 0;
	while (L != NULL)
	{
		int result = 1;
		for (int j = 2; j <= L->Data; j++)
		{
			result *= j;
		}
		sum += result;
		L = L->Next;
	}
	return sum;
}
//求自定类型元素的最大值
ElementType Max(ElementType S[], int N) {
	ElementType max = S[0];
	for (int i = 1; i < N; i++)
	{
		if (S[i] > max) {
			max = S[i];
		}
	}
	return max;
}
//自定类型元素的平均
ElementType Average(ElementType S[], int N) {
	ElementType sum = 0;
	for (int i = 0; i < N; i++)
	{
		sum += S[i];
	}
	return (sum*1.0 / N);
}
//简单求和
int Sum(int List[], int N) {
	int sum = 0;
	for (int i = 0; i < N; i++)
	{
		sum += List[i];
	}
	return sum;
}
//多项式求值
double f(int n, double a[], double x) {
	double sum = 0;
	//这里的pow可以重复利用,一开始没仔细想,最后一个测试点过不了……
	double pow = 1;
	for (int i = 0; i <= n; i++)
	{
		if (i != 0) {
			pow *= x;
		}
		sum += a[i] * pow;
		
	}
	return sum;
}
//简单输出整数,一开始P写成小写了,一直过不了编译(?)
void PrintN(int N) {
	for (int i = 1; i <= N; i++) {
		printf("%d\n", i);
	}
}

还有C++的

// 折半查找,关键点在于位置标记没找到的时候如何移动,尤其是只剩两个的时候怎么走
int  Search_Bin(SSTable T, KeyType k) {
	int length = T.length;
	int pos = (length + 1) / 2;

	while (length!=0)
	{
		if (T.R[pos].key == k) {
			return pos;
			break;
		}
		else if (T.R[pos].key < k) {
			pos = pos + length / 4;
			if (length / 4 == 0) {
				pos++;
			}
		}
		else {
			pos = pos - length / 4;
			if (length / 4 == 0) {
				pos--;
			}
		}
		length /= 2;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值