#include<stdio.h> #include<string.h> #include "iostream" // declare struct number{ bool negative=0; // positive or negative int num[5002]={}; // 10 based number int length=0; }; void add(number* num1, number* num2); void minus(number* num1, number* num2); void multiple(number* num1, number* num2); void divide(number* num1, number* num2); // implement void add(number* num1, number* num2){ // negative handling if (num1->negative && !num2->negative){ num1->negative=0; minus(num2,num1); return; } if (num2->negative && ! num1->negative){ num2->negative=0; minus(num1,num2); return; } if (num1->negative && num2->negative){ num1->negative=0; num2->negative=0; add(num1,num2); num1->negative=1; return; } // positive calculate int length=num1->length>=num2->length?num1->length:num2->length; for(int i=0;i<length;i++){ num1->num[i]=num1->num[i]+num2->num[i]; if (num1->num[i]>9){ if (i==length-1){ num1->length++; } num1->num[i+1]++; num1->num[i]-=10; }; } } void minus(number* num1, number* num2){ // negative handling if (num2->negative){ num2->negative=0; add(num1,num2); return; } if (num1->negative){ num1->negative=0; add(num1,num2); num1->negative=1; return; } // positive calculate int length=num1->length>=num2->length?num1->length:num2->length; for (int i=length-1; i>-1;i--){ num1->num[i]=num1->num[i]-num2->num[i]; if (num1->num[i]<0){ if (i==length-1){ num1->negative=1; num1->num[i]=0-num1->num[i]; } else{ num1->num[i+1]-=1; num1->num[i]+=10; } } } // calculate length for (int i=num1->length-1; i>=0;i--) { if (num1->num[i] == 0 && i == num1->length - 1) { num1->length--; } } } void multiple(number* num1, number* num2){ num1->negative=num1->negative^num2->negative; int tmp[5002]={}; int length1=num1->length; int length2=num2->length; int k=0; int tmpLength=0; for(int i=0;i<length2;i++){// mutiple for (int j=0;j<length1;j++){ // multipled tmp[j+i]=num2->num[i]*num1->num[j]; k=0; while (tmp[j+i+k]>9){ tmp[j+i+k+1]+=tmp[j+i+k]/10; tmp[j+i+k]%=10; k++; } tmpLength=tmpLength<j+i+k+1?j+i+k+1:tmpLength; } } // clone tmp 2 num1 num1->length=tmpLength; for (int i=0;i<tmpLength;i++){ num1->num[i]=tmp[i]; } } void divide(number* num1, number* num2){ std::cout<<"It is too complicated, do you want me die?"<<std::endl; } int main(){ char num1[5002]={},num2[5002]={},oper[1]={},result[5002]={}; number first,second; scanf("%s%s%s",num1,num2,&oper); // convert input 2 formated number first.negative=(num1[0]=='-'); first.length=strlen(num1)-(int)(num1[0]=='-'); for(int i=0;i<strlen(num1)-(num1[0]=='-');i++){ first.num[i]=num1[strlen(num1)-i-1]-'0'; } second.negative=(num2[0]=='-'); for(int i=0;i<strlen(num2)-(num2[0]=='-');i++){ second.num[i]=num2[strlen(num2)-i-1]-'0'; } second.length=strlen(num2)-(int)(num2[0]=='-'); switch (oper[0]){ case '+': add(&first,&second); break; case '-': minus(&first,&second); break; case '*': multiple(&first,&second); break; case '/': divide(&first,&second); break; default: break; }; // Post process the result if (first.negative){ result[0]='-'; } for (int i=0;i<(first.length?first.length:1);i++){ result[first.length+first.negative-i-1]=+first.num[i]+'0'; } std::cout<<result<<std::endl; std::cin.get(); std::cin.get(); }
大整数的加减乘法,没有除法,你想累死我啊?
最新推荐文章于 2025-03-25 15:22:12 发布