数位拆解即把一个给定的数字各个数位上的数字拆开,如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<stdio.h>
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值得差会得到一个整数,该整数就是原来的那个相应的数字。黑框运行结果
后记:
若输入的数字用字符串保存,又想在算法中对该数字进行运算,例如表达式求值问题,则可以用以下代码将任意位数的“数值”字符串转换为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;
}