#include <stdio.h>
#include <string.h>
int compare(int *b, int *c, int l1, int l2) {//比较两个数哪个大
if (l1 > l2)
return 1;
if (l1 < l2)
return 0;
if (l1 == l2) {
int i;
for (i = l1 - 1; i >= 0; i--) {
if (b[i] > c[i])
return 1;
if (b[i] < c[i])
return 0;
}
if (i == -1)
return 1;
}
}
int minus(int *b, int *c, int *d, int max) {//做减法
int i, num;
for (i = 0; i < max; i++) {
num = b[i] - c[i] + d[i];
if (num < 0) {
num += 10;
d[i + 1] = -1;
}
d[i] = num;
}
}
int main() {
int n;
scanf("%d\n", &n);
for (int s = 0; s < n; s++) {
char a[1004] = {0}, b[502] = {0}, c[502] = {0}, ch;
int d[503] = {};
scanf("%s", a);
int l = strlen(a);
int i = 0, j = 0, flag = 0;
for (i = 0; i < l; i++) {//将两个数倒序存入b、c数组中
if (a[l - i - 1] == '+' || a[l - i - 1] == '-') {
flag = 1, j = 0;
ch = a[l - i - 1];
continue;
}
if (flag == 0) {
c[j] = a[l - i - 1];
j++;
} else {
b[j] = a[l - i - 1];
j++;
}
}
int l1 = strlen(b), l2 = strlen(c), max = 0, num;
max = (l1 >= l2) ? l1 : l2;
for (i = 0; i < l1; i++)
b[i] = b[i] - '0';
for (i = 0; i < l2; i++)
c[i] = c[i] - '0';
if (ch == '+') {//做加法
for (i = 0; i < max; i++) {
num = b[i] + c[i] + d[i];
if (num >= 10) {
num -= 10;
d[i + 1] = 1;
}
d[i] = num;
}
} else {
if (compare((int *)b, (int *)c, l1, l2))
minus((int *)b, (int *)c, d, max);
else {
minus((int *)c, (int *)b, d, max);
printf("-");
}
}
for (i = 500; i >= 0; i--) {//找出第一个不为0的值
if (d[i] != 0)
break;
}
//printf("%d\n", i);
if (i == -1 && d[0] == 0)
printf("0\n");
else {
for (; i >= 0; i--)
printf("%d", d[i]);
printf("\n");
}
}
return 0;
}
这是代码,只有减法部分出了问题,另外还有一个名字叫小蜜蜂但本质是斐波那契数列的题目,题目如下
** 一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。
请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。
输入:
分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1~100 之间,且 a<b 。)
输出:
方案数量。
测试输入期待的输出时间限制内存限制额外进程
测试用例 1 以文本方式显示1 4↵
以文本方式显示3↵
1秒 64M 0
测试用例 2 以文本方式显示1 5↵
以文本方式显示5↵
1秒 64M 0
测试用例 3 以文本方式显示1 50↵
以文本方式显示12586269025↵
1秒 64M 0
测试用例 4 以文本方式显示2 50↵
以文本方式显示7778742049↵
1秒 64M 0
测试用例 7 以文本方式显示1 100↵
以文本方式显示354224848179261915075↵
1秒 64M 0 **
#include <stdio.h>
int main() {
int a, b, i, j, t = 0;//t是进位
int c[101][101] = {0};
c[0][0] = 1, c[1][0] = 1;
scanf("%d %d", &a, &b);
for (i = 2; i <= b - a; i++) {
t = 0;
for (j = 0; c[i - 1][j] != 0; j++) {
c[i][j] = (c[i - 1][j] + c[i - 2][j] + t) % 10;
t = (c[i - 1][j] + c[i - 2][j] + t) / 10;
}
}
if (t != 0)
printf("1");
j--;
for (; j >= 0; j--)
printf("%d", c[i - 1][j]);//倒序输出
printf("\n");
return 0;
}
之前我测出来貌似是内循环少循环一次,但是不知道为什么
最后想问一下这种加减的用哪种方法更好一些,感觉有很多方法,(本想加题目图片的,但是一点进图片标识就卡住了,无语😓)