1016 部分A+B 1017 A除以B
天气好
1016 部分A+B (15 分)
正整数 A 的“D**A(为 1 位整数)部分”定义为由 A 中所有 D**A 组成的新整数 P**A。例如:给定 A=3862767,D**A=6,则 A 的“6 部分”P**A 是 66,因为 A 中有 2 个 6。
现给定 A、D**A、B、D**B,请编写程序计算 P**A+P**B。
输入格式:
输入在一行中依次给出 A、D**A、B、D**B,中间以空格分隔,其中 0<A,B<109。
输出格式:
在一行中输出 P**A+P**B 的值。
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
题解:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
char arra[11];
char a;
char arrb[11];
char b;
int counta = 0;
int countb = 0;
int i, j;
for (i = 0; arra[i - 1] != ' '; i++)
{
scanf("%c", &arra[i]);
}
scanf("%c ", &a);
for (j = 0; arrb[j - 1] != ' '; j++)
{
scanf("%c", &arrb[j]);
}
scanf("%c", &b);
for (int temp = 0; temp < i-1; temp++)
{
if (arra[temp] == a)
counta++;
}
for (int temp = 0; temp < j-1; temp++)
{
if (arrb[temp] == b)
countb++;
}
int sum = 0;
for (int temp = 0; temp < counta; temp++)
{
sum += (a - '0') * pow(10, temp);
}
for (int temp = 0; temp < countb; temp++)
{
sum += (b - '0') * pow(10, temp);
}
printf("%d", sum);
}
总结:
写的挺蠢的,倒是能跑。
聪明点的方法,将A,B设成数字,每次对10取余就行。
1017 A除以B (20 分)
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
题解:
#include<stdio.h>
int main()
{
int arr[2000];
char n='1';
int x;
int yushu;
int count = 0;
for (int i = 0; n != ' '; i++)
{
scanf("%c", &n);
arr[i] = n - '0';
count++;
}
scanf("%d", &x);
yushu = arr[0];
int out[2000];
int i;
if (arr[0] < x && arr[1] < 0)
{
printf("0 %d", arr[0]);
return 0;
}
for (i = 0; i < count-2; i++)
{
if (yushu + arr[i + 1] != 0)
{
out[i] = (yushu * 10 + arr[i + 1]) / x;
yushu = (yushu * 10 + arr[i + 1]) % x;
}
else
{
out[i] = 0;
yushu = 0;
}
}
for (int j = 0; j < i; j++)
{
printf("%d", out[j]);
}
printf(" %d", yushu);
}
总结:
这题还挺有意思的,分解了除法,用程序做到了竖式除法。
有三个比较有意思的点
- 输入。因为要一个一个读取数字,一开始我用的字符型数组,每次调用还得-'0',后来突然开悟,在读入的时候转成int型不就行了
- 一个情况,比如一虎(2200)除以2,就会出现0/2的,要额外列出
- 一个坑,如果除数大于被除数,比如1 6,按原来的算法就不行,要额外列出