- Only add or minus two large number(+ or -).
- All inputs are positive numbers.
- The number may contain an decimal point, you need to handle it by your self.
- The first input is how many testing data.
- The answer you print should have it’s data number.
範例輸入:(intput.txt)
5
12345678991019231124+1234567890000000
12345678991019231124-1234567890000000
1-123456789123456789
123465789.123456789+987654321.987654321
1000000000-0.1
範例輸出:
#1:12346913558909231124
#2:12344444423129231124
#3:-123456788
#4:1111111111.11111111
#5:999999999.9
備註:
這題....我只寫整數加減而已,而且還寫得很醜.....反正我是放棄了。
根據助教,可以想成好幾個整數來代表,那只要處理接起來時的進位問題就好,但讀檔真的好難處理.......。
程式碼:
#include<stdio.h>
#include "FileHandler.h"
void add(char *a, char *b, char *c,int length_a,int length_b)
{
int n;
if (length_a > length_b)
{
n = length_b;
for (int i = 0; i < n; i++)//clean char to int and add
c[i] = a[length_a - 1 - i] - '0' + b[length_b - 1 - i] - '0';
for (int i = n; i < length_a; i++)//add the rest
{
c[i] = a[length_a - 1 - i]-'0';
}
for (int i = 0; i < length_a-1; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
for (int i = 0; i < length_a; i++)//int to char
c[i] += '0';
}
else
{
n = length_a;
for (int i = 0; i < n; i++)
c[i] = a[length_a - 1 - i] - '0' + b[length_b - 1 - i] - '0';
for (int i = n; i < length_b; i++)
c[i] = b[length_b - 1 - i] - '0';
for (int i = 0; i < length_b - 1; i++)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
for (int i = 0; i < length_b; i++)
c[i] += '0';
}
}
void sub(char *a, char *b, char *c, int length_a, int length_b)
{
int n;
if (length_a > length_b) //when a>b, find a-b
{
n = length_b;
for (int i = 0; i < length_b; i++)
{
c[i] = (a[length_a - 1 - i] - '0') - (b[length_b - 1 - i] - '0');
}
for (int i = n; i < length_a ; i++)
c[i] = a[length_a - 1 - i] - '0';
for (int i = length_b - 1; i >= 0; i--)
{
if (c[i] < 0)
{
c[i + 1] -= 1;
c[i] += 10;
}
}
for (int i = 0; i < length_a; i++)
c[i] += '0';
}
else //caution: when length_a==length_b but a>b
{
n = length_a;
for (int i = 0; i < length_a; i++)
c[i] = (b[length_b - 1 - i] - '0')-(a[length_a-1-i]-'0');
for (int i = n; i < length_b; i++)
c[i] = b[length_b - 1 - i] - '0';
for (int i = length_a - 1; i >= 0; i--)
{
if (c[i] < 0)
{
c[i + 1] -= 1;
c[i] += 10;
}
}
for (int i = 0; i < length_b; i++)
c[i] += '0';
c[length_b] = '-';
}
}
int main()
{
char *str = readAllTextFromFile("./input.txt");
int n = 0, i_now = 0, t = 1;
while (str[i_now] != '\n')//read case number
n = str[i_now++] - '0' + n * 10;
i_now++;//skip new line
while (n--)
{
char num1[200] = { 0 }, num2[200] = { 0 }, result[200] = { 0 };
int length_1 = 0, length_2 = 0, length = 0, check1 = 0, check2 = 0;
char command[1];
while (str[i_now] != '+'&&str[i_now] != '-')//read num1 while '+' or '-' then stop
{
if (str[i_now] == '.')
check1 = 1;
num1[length_1++] = str[i_now++];
}
command[0] = str[i_now++];
while (str[i_now] != '\n'&&str[i_now]!=NULL)//read num2 while '\n' then stop
{
if (str[i_now] == '.')
check2 = 1;
num2[length_2++] = str[i_now++];
}
i_now++;
//for (int i = 0; i < length_1; i++)//print num1
// printf("%c", num1[i]);
//printf("%c", command[0]);//print '+' or '-'
//for (int i = 0; i < length_2; i++)
// printf("%c", num2[i]);//print num2
//printf("\n");
printf("#%d:", t++);//print result
if (check1 == 0 && check2 == 0)
{
if (command[0] == '+')//add
add(num1, num2, result, length_1, length_2);
else if (command[0] == '-')//substract
sub(num1, num2, result, length_1, length_2);
for (int i = 199; i >= 0; i--)
{
if (result[i] != NULL)
printf("%c", result[i]);
}
}
else if(check1==1&&check2==1)
{
;
}
printf("\n");
}
system("pause");
return 0;
}
沒有留言:
張貼留言