数位拆解

数位拆解即把一个给定的数字各个数位上的数字拆开,如1234即拆成1,2,3,4。

题目描述:

写个算法,对2个小于1000000000的正整数,进行拆分后按如下示例求结果

示例:123*45 = 1*4+1*5+2*4+2*5+3*4+3*5 = 54

样例输入:

 123 45

样例输出:

 54

问题分析:

 一个四位正整数x,可以写为:

        x=a*1000+b*100+c*10+d

 x的个位显然等于:x%10 = (a*1000+b*100+c*10+d)%10=d

 求x的十位,先让x整除10

       x/10=(a*1000+b*100+c*10+d)/10

        x/10=a*100+b*10+c

则x的十位显然等于:(x/10)%10=(a*100+b*10+c)%10=c

 其余可以类推,均是取模%,整除/的运算。

对于上题,直接看代码吧:

#include

int main()
{
	int buf1[20],buf2[20];						//数位拆分后的容器
	int no_1,no_2;								//整数变量的当前位数
	int num_1,num_2;							//保存两个整数变量
	int ans;									//保存答案

	while (scanf("%d%d",&num_1,&num_2)!=EOF)
	{
		no_1=0;
		no_2=0;
		ans=0;

		if (num_1==0) buf1[no_1]=num_1;			//若第一个数为零
		else/*以下循环实现非零数字的数位拆解*/									
			while (num_1!=0)					//不为零时可拆解
			{
				buf1[no_1++]=num_1%10;
				num_1/=10;
			}
		if (num_2==0) buf2[no_2]=num_2;			//若第二个数为零
		else
			while (num_2!=0)					//不为零时拆解
			{
				buf2[no_2++]=num_2%10;
				num_2/=10;
			}
		for (int i = 0; i < no_1; i++)
			for (int j = 0; j < no_2; j++)
				ans += buf1[i]*buf2[j];

		printf("%d\n",ans);
		
	}
	return 0;
}
同时还有一种常用的讨巧的方法也可实现数位拆解
int main()
{
	char buf_1[11],buf_2[11];
	int ans;

	while (scanf("%s%s",buf_1,buf_2)!=EOF)				//利用字符串读入两个输入
	{
		ans = 0;										//累加变量初始化
		for (int i = 0; buf_1[i]!='\0'; i++)			//遍历串1直到串结尾
			for (int j = 0;buf_2[j]!='\0' ; j++)		//遍历串2直到串结尾
				ans+= (buf_1[i]-'0')*(buf_2[j]-'0');	//计算两串中每一个字符所代表的数字,然后乘积累加
		
		printf("%d\n",ans);
	}

	return 0;
}
 该算法的核心原理即0-9的数字以字符保存在字符串中时, 实质保存的是其ASCII值,用每一位的ASCII值减去'0'的ASCII值得差会得到一个整数,该整数就是原来的那个相应的数字。
黑框运行结果

数位拆解_第1张图片

后记:

 若输入的数字用字符串保存,又想在算法中对该数字进行运算,例如表达式求值问题,则可以用以下代码将任意位数的“数值”字符串转换为int型地数字。

int main()
{
	char input_num[20] = "1234";			//输入字符串
	int outpot_num = 0;						//输出数字
	int i = 0;

	while (input_num[i]!='\0')				//转换操作
	{
		outpot_num = outpot_num*10 + input_num[i]-'0';
		i++;
	}

	printf("%d\n",outpot_num);				//输出结果

	return 0;
}






你可能感兴趣的:(考研复试上机,数学问题)