(笔试)一些基本计算问题<一>

问题一:判断一个数是否是回文数。

回文数在笔试中经常出现,除了字符串操作和数据机构外的考题经常出现。

回文数也就是一个思维,也就是使用一个循环,基本上自己书写一遍就不会再觉得很难了。它的变形可能是判断一个字符串数字是否是回文数,这时只需将数字变为数组即可。

下面是一个判断一个数字是否是回文数的例程。

#include <iostream>
#include <string>

using namespace std;


int main(int argc, char* argv[])
{
	int in_data = 123321;
	int data = in_data;
	int num = 0;
	int new_data = 0;
	while(data)
	{
		num = data%10;
		new_data = new_data*10+num;
		data = data/10;
	}
	cout<<"new data:"<<endl;
	cout<<new_data<<endl;

	if (new_data == in_data)
		cout<<"this is a huihuan data!"<<endl;
	else
		cout<<"Wrong data!"<<endl;
	return 0;
}

 

问题二:求两个数的最大公约数(辗转相除法)

算法讲解第一问题,求两个数的最大公约数;

#include <iostream>
#include <string.h>

using namespace std;

int max_gongyueshu(int a, int b)
{
	int max;
	int min;
	max = a>b?a:b;
	min = a>b?b:a;
	if (max%min == 0)
		return min;
	else
		return max_gongyueshu(min,max%min);
}

int main()
{
	int a = 15750;
	int b = 27216;

	printf("The max gongyueshu is: %d\n",max_gongyueshu(a,b));

	return 0;
}

问题三:求两个数的最小公倍数

最小公倍数 = 两个数的乘积/最小公约数;

#include <iostream>
#include <string.h>

using namespace std;

int max_gongyueshu(int a, int b)
{
	int max;
	int min;
	max = a>b?a:b;
	min = a>b?b:a;
	if (max%min == 0)
		return min;
	else
		return max_gongyueshu(min,max%min);
}

int main()
{
	int a = 15;
	int b = 9;

	printf("The max gongyueshu is: %d\n",max_gongyueshu(a,b));
	printf("The min gongbeishu is :%d\n",a*b/max_gongyueshu(a,b));

	return 0;
}

 

 

问题四:大数相乘

大数的乘法直接使用小学的进位方法实现,主要思想是首先分步求出各个位的值,然后在分别判断是否进位,需要进位的就进位,最终将得到的值放在数组里,将数组的值变为字符输出即可。

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

char* multiply(char* a, char* b)
{
	int i, j;
	int ca, cb;
	int* s;
	char* data;
	ca=strlen(a);
	cb=strlen(b);
	s=(int*)malloc(sizeof(int)*(ca+cb));
	data = (char*)malloc(sizeof(char)*(ca+cb));
	for (i=0;i<ca+cb;i++)
		s[i]=0;
	for (i=0;i<ca;i++)
		for (j=0;j<cb;j++)
			s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
	for (i=ca+cb-1;i>=0;i--)
		if (s[i]>=10)
		{
			s[i-1]+=s[i]/10;
			s[i]%=10;
		}
		i=0;
		while (s[i]==0)
			i++;
		for (j=0;i<ca+cb;i++,j++)
			data[j]=s[i]+'0';
		data[j]='\0';
		free(s);

		return data;
}

int main()
{
	char num1[20] = "17";
	char num2[20] = "25";

	char* result = NULL;

	result = multiply(num1,num2);

	printf("The result is %s\n",result);

	return 0;
}

 

点赞