PAT1065题目如下:
解题思路:
本题,笔者尝试了很多数据结构,但是后来发现还是,数组实现起来简单些。虽然也看到其他实现起来更简单的方法(比如直接用long实现),但是考虑到这道题可能就是和大数运算有关,因此采用了宏定义,这样就可以对数组的大小自行调节,任意大的数也可以操作(在保证不超过内存的前提下哈)
笔者的思路是利用flag = 1 => 非负数,flag = -1 =>负数, 判断A+B是否> C,即判断A+B-C是否为正数。
因此可将A、B、C的符号赋给其每一位,从低位到高位进行求和,求和的次数是A、B、C中的最多位数,若遇到A||B||C的高位不够的时候,将其设为0.
举例说明:
A:123 B:1234 C: -12345那么,真正运算就可以设计成酱的:sum[length-1]=3+4+5,sum[0]=0+0-(-1)*5;
A:123 B:1234 C:12345 那么,真正的运算就为:sum[length-1]=3+4+(-1)*5,sum[1]=0+1-2*(1)
关键思路就是上面的,再注意下细节就OK啦~
代码如下
#include <iostream>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 50 //注意宏定义后不要加冒号哦
using namespace std;
char A[MAX_LENGTH] = { 0 };
char B[MAX_LENGTH] = { 0 };
char C[MAX_LENGTH] = { 0 };
int sum[MAX_LENGTH] = { 0 };
int flag[MAX_LENGTH] = { 0 };
void compute(char A[],char B[],char C[],int Case)
{
int flag_a = 1, flag_b = 1, flag_c = -1;
int len_a = strlen(A), len_b = strlen(B),len_c = strlen(C);
int i_a = len_a-1, i_b = len_b-1, i_c = len_c-1;
if (A[0] == '-')
{
flag_a = -flag_a;
len_a--;
}
if (B[0] == '-')
{
flag_b = -flag_b;
len_b--;
}
if (C[0] == '-')
{
flag_c = -flag_c;
len_c--;
}
int length = len_a > len_b ? len_a: len_b;
length = length > len_c ? length : len_c;
int i = length -1,a = 0, b = 0, c = 0;
while (i >= 0){
if (A[i_a] == '-'||i_a < 0)
a = 0;
else
a = A[i_a--]-'0';
if (B[i_b] == '-'||i_b < 0 )
b = 0;
else
b = B[i_b--]-'0';
if (C[i_c] == '-'||i_c < 0)
c = 0;
else
c = C[i_c--]-'0';
sum[i] = a * flag_a + b * flag_b + c *flag_c;
// cout << sum[i];
i--;
}
// cout << endl;
i = length - 1;
while (i >= 0)
{
sum[i] += flag[i + 1];
flag[i] = sum[i] / 10;
sum[i] %= 10;
if (i == 0&&sum[i]==0){
if (flag[i] != 0)
sum[i] = flag[i];
}
i--;
}
for (i = length-1; i >= 0; i--)
{
// cout << sum[i];
if (sum[i] > 0){
cout << "Case #" << Case << ": true"<<endl;
break;
}
else{
if (sum[i] < 0){
cout << "Case #" << Case << ": false"<<endl;
break;
}
else
{
if (i != length - 1)
continue;
else
{
cout << "Case #" << Case << ": false"<<endl;
break;
}
}
}
cout << "Case #" << Case << ": false"<<endl;
}
}
int main(){
int count = 0;
int Case = 1;
cin >> count;
while (Case <= count){
cin >> A;
cin >> B;
cin >> C;
compute(A, B, C,Case);
Case++;
}
// system("PAUSE");
return 0;
}