#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 1000
// E.X. max of int is 2147483647
using namespace std;
// print
void print(int a[maxn]){
int i=maxn-1; // 要印的數字位置
while(i>=0 && a[i]==0) i--; // 數字開頭的零都不印
if(i<0)cout << '0';
else while(i>=0) cout << a[i--];
}
// a > b or a < b
int compare(int a[maxn], int b[maxn])
{
for (int i=maxn-1; i>=0; i--) // 從高位數開始比,對應的位數相比較。
if (a[i] != b[i] && a[i] > b[i]){ // 發現 a b 不一樣大,馬上回傳結果。
return 1; // 1 = a>b
}
else if (a[i] != b[i] && a[i] < b[i]){
return 2; // 2 = a<b
}
return false; // 完全相等
}
// c = a + b;
void add(int a[maxn], int b[maxn], int c[maxn])
{
for (int i=0; i<maxn; i++) // 對應的位數相加
c[i] = a[i] + b[i];
for (int i=0; i<maxn-1; i++) // 一口氣進位
{
c[i+1] += c[i] / 10; // 進位
c[i] %= 10; // 進位後餘下的數
}
}
// c = a * b;
void mul(int a[maxn], int b[maxn], int c[maxn])
{
for (int i=0; i<maxn; i++)
c[i] = 0;
for (int i=0; i<maxn; i++)
for (int j=0; j<maxn; j++)
if (i+j < maxn)
c[i+j] += a[i] * b[j];
for (int i=0; i<maxn-1; i++) // 一口氣進位
{
c[i+1] += c[i] / 10;
c[i] %= 10;
}
}
char max_int[maxn] = "2147483647";
char input_a[maxn]={'\0'};
char op1,op2,op3;
char input_b[maxn]={'\0'};
int a[maxn],b[maxn],intmax[maxn],result[maxn];
int main(){
for(int i=0;i<maxn;i++)a[i]=0;
for(int i=0;i<maxn;i++)b[i]=0;
while(scanf("%s",&input_a)!=EOF){
scanf("%c%c%c",&op1,&op2,&op3);
scanf("%s",&input_b);
printf("%s %c %s\n",input_a,op2,input_b);
//change input into integer array
int len = strlen(input_a);
for(int i=0;i<len;i++){
a[i]=input_a[len-i-1]-48;
}
len = strlen(input_b);
for(int i=0;i<len;i++){
b[i]=input_b[len-i-1]-48;
}
len = strlen(max_int);
for(int i=0;i<len;i++){
intmax[i]=max_int[len-i-1]-48;
}
int cmp_a = compare(a,intmax);
if(cmp_a==1)printf("first number too big\n");
int cmp_b = compare(b,intmax);
if(cmp_b==1)printf("second number too big\n");
if(op2=='+')add(a,b,result);
if(op2=='*')mul(a,b,result);
int cmp_result = compare(result,intmax);
if(cmp_result==1)printf("result too big\n");
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(result,0,sizeof(result));
}
return 0;
}
2014年10月1日星期三
[UVa] 465 - Overflow
訂閱:
發佈留言 (Atom)
-
因為先前寫UVa時,檔案名稱有時會花心思改,有時就直接把題目名稱加上.cpp就貼上了 導致現在有不同的格式出現 現在要處理的事情很簡單 1. 去除空白 2. 將底線 ( _ ) 換成dash ( - ) 經過一番查詢,終於發現最簡單的方法 - re...
-
文章出處: http://infbugs.blogspot.tw/2011/12/c_20.html 謝謝沙耶,解答了我長久以來對於 input/output 的疑惑。 C 語言入門 - 在線上批改系統練功 如何練習使用基本語法 自己出個練習題試著寫...
-
一開始用數學方法推斷得出,設輸入為n k為在n的前一斜線列數,故只要找到 (1+k)*k/2 < n 的最大k值,即可判定 k%2 == 1 => ((2*n)-(k*k)-k)/2 / ((k*k)+(3*k)-(2*n)+4)/2 k%2 ==...
沒有留言:
發佈留言