今天生日,我都24了,时间过的可真快。想要学的东西太多了,大学真是混了四年,哎。共勉吧,各位。PEACE & LOVE
1016 部分A+B
思路: 两次循环,每次循环读两个数 A 和 DA,通过取余的方式判断每位数字是否和DA相等,相等则组数 PA,最后求和输出。
#include<stdio.h>
int main() {
int n, d, tmp, sum = 0;
for(int i=0; i<2; i++) {
tmp = 0;
scanf("%d %d", &n, &d);
while(n > 0) {
if(n%10 == d)
tmp = tmp*10 + d;
n /= 10;
}
sum += tmp;
}
printf("%d", sum);
return 0;
}
1017 A除以B
思路: 给的数字是不超过1000位的整数,数字很大所以用字符串存被除数并用模拟手算的方式,边计算边输出。大体过程就是手算除法的过程不赘述了,但要注意商的最高位不可以是0,但计算过程中的0是要输出的,还有被除数小于除数的情况。
#include<stdio.h>
#define LEN 1005
int main() {
char dividend[LEN];
int divisor, flag, d;
d = flag = 0;
scanf("%s %d", ÷nd, &divisor);
for(int i=0; dividend[i]!= '\0'; i++) {
d = d*10 + dividend[i] - '0';
if(!flag) {//如果被除数的第一位(最高位)小于除数,那就要将最高位和次高位组成一个数进行运算,但这个情况仅发生在最高位的时候。
if(d < divisor && dividend[i+1] !='\0')
d = d*10 + dividend[++i]-'0';
}
printf("%d", d/divisor);
d %= divisor;
flag = 1;
}
printf(" %d",d);
return 0;
}
1018 锤子剪刀布
思路: 在 ”布 锤子 剪刀“这个 顺序中,每个手势只能战胜下一个手势,输给上一个手势。例如,布只能战胜锤子,输给剪刀。所以通过加一取余的方式可以判断是否可以战胜乙的手势。输出时,乙的输平赢的情况与甲相反,所以输赢情况只需记录一个人的即可。坑点注意: 当都是平局时,胜利最多的手势要输出布。
#include<stdio.h>
void Print(int arr[], int start, int end) {//输出输平赢情况
int i = start;
while(i != end) {
printf("%d ", arr[i]);
start > end ? i-- : i++ ;
}
printf("%d\n",arr[end]);
}
void _Print(int arr[], char hand[]) {//输出二人获胜次数最多的手势
int maxIndex, max;
max = maxIndex = 0;
for(int i=0; i<3; i++) {
if(arr[i] > max) {
max = arr[i];
maxIndex = i;
}
}
printf("%c",hand[maxIndex]);
}
int main() {
char a, b, hand[3] = {'B', 'C', 'J'};
int cnt, res[3] = {0};//记录输平赢的情况
int _res1[3]= {0};//记录甲赢的手势情况
int _res2[3] = {0};//记录乙赢的手势情况
scanf("%d", &cnt);
while(cnt-- > 0) {
scanf("\n%c %c", &a, &b);
if(a == b)
res[1]++;
else {
int i = 0;
while(hand[i] != a)
i++;
if(hand[(i+1)%3] == b) {//甲获胜
res[2]++;
_res1[i]++;//记录甲获胜的手势
} else {
res[0]++;
i == 0 ? i = 2 : i--;//甲只会输给 布 锤子 剪子这个顺序中,甲的手势的上一个手势。
_res2[i]++;//记录乙获胜的手势情况
}
}
}
Print(res, 2, 0);
Print(res, 0, 2);
_Print(_res1, hand);
printf(" ");
_Print(_res2, hand);
return 0;
}
1019 数字黑洞
思路: 数字分解,排序,组数,相减。 **坑点:**输入为6174
#include <stdio.h>
void Sort(int a[], int n);
void sub(int a[], int *n);
int main() {
int n, a[4];
scanf("%d", &n);
if (n % 1111 == 0) {
printf("%.4d - %.4d = 0000", n, n);
} else {
do {
Sort(a, n);
sub(a, &n);
} while (n != 6174);
}
}
void Sort(int a[], int n) {
for (int i = 0; i < 4; i++) { //分解数
a[i] = n%10;
n /= 10;
}
//直接插入排序,递减序列
for (int i = 1; i < 4; i++) {
if (a[i] > a[i - 1]) {
int j = i - 1;
int index = a[i];
for (; index > a[j] && j >= 0; j--)
a[j + 1] = a[j];
a[j + 1] = index;
}
}
}
void sub(int a[], int *n) {
int num1 = 0;//被减数
int num2 = 0;//减数
for (int i = 0; i < 4; i++)
num1 = num1 * 10 + a[i];
for (int j = 3; j >= 0; j--)
num2 = num2 * 10 + a[j];
printf("%.4d - %.4d = %.4d", num1, num2, num1 - num2);
if (num1 - num2 != 6174)
printf("\n");
*n = num1 - num2;
}