这里面很多题都非常简单非常基础,算法不止一个,这种基础题不用要求太严格,能过就行。
//数字 乘以 数组保存的数字 的方法。
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;
}