一、数位拆解
- 题目描述
写个算法,对2个小于1000000000的输入,求结果。 特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35
- 输入描述
两个小于1000000000的数
- 输出描述
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
- 示例输入
123 45
- 示例输出
54
代码8.1.1 求余取模,除10移位
#include <stdio.h>
int main(){
int a, b;
while(scanf("%d %d",&a, &b) != EOF)
{
int buf1[20], buf2[20]; //暂存数位拆解出来的数
int i = 0, j = 0, s = 0;
while(a > 0)
{
buf1[i++] = a % 10;
a /= 10;
}
while(b > 0)
{
buf2[j++] = b % 10;
b /= 10;
}
for( int m = 0; m < i; m++)
{
for(int n = 0; n < j; n++)
{
s += buf1[m] * buf2[n];
}
}
printf("%d\n", s);
}
return 0;
}
8.1.2 存为字符串
#include <stdio.h>
int main(){
char a[11], b[11]; //利用字符串读入
while(scanf("%s%s",a,b) != EOF)
{
int s = 0;
for( int m = 0; a[m] != 0; m++)
{
for(int n = 0; b[n] != 0; n++)
{
//字符与字符'0'ASCII值的差为字符对应的数字
s += (a[m] - '0') * (b[n] - '0');
}
}
printf("%d\n", s);
}
return 0;
}
二、进制转换
- 题目描述
输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。
- 输入描述
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
- 输出描述
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
- 示例输入
8 1300 48
2 1 7
0
- 示例输出
2504
1000
代码8.2
#include <stdio.h>
int main()
{
long long a, b; //确保不会溢出
int m;
while(scanf("%d", &m) != EOF)
{
if(m == 0) break;
scanf("%lld%lld", &a, &b);
a = a + b; //先求和
//转为m进制数
int s[50], i = 0;
do{
s[i++] = a % m;
a /= m;
}while(a != 0); //即使a=0也至少会执行一次do
for(int j = i - 1; j >= 0; j--)
{
printf("%d",s[j]); //顺序逆过来,高位到低位
}
printf("\n");
}
return 0;
}