jackchen0227 发表于 2013-1-26 13:35:16

joj 2749 大数比较大小与减法

http://dl.iteye.com/upload/attachment/495032/7a327ace-17e3-3ac7-b2b1-cb491d3bccdc.png
/*题目不难,一个大数减法,一个大数的比较,关键是边界条件的检查*/#include <stdio.h>#include <string.h>#include <stdlib.h>int code = {0,1,2,-1,-1,5,9,-1,8,6}; //这个是0-9旋转之后的数字,-1表示旋转之后出错/*大数的减法*/voidminus(char s,char s1){int k = 0;for(int i=strlen(s) - 1;i> -1;i--) //注意此时倒着计算,是从 strlen(s) - 1开始,不是从 strlen(s){if(s < (s1 + k)){//s = 10 + s - s1 - k; //做减法后还要转换成字符,也就是加上 '0's = 10 + s - s1 - k + '0';k = 1;}else {s = s - s1 - k + '0';k = 0;}}bool flag = false; //由于结果的高位也就是数组的前面可能出现 0,而这些 0 是没有必要输出的。for(int j=0; j<strlen(s);j++){if(flag){printf("%c",s);continue;}if(s == '0') continue;//s = '\0';else{printf("%c",s);//别忘了这个,这个边界要注意flag = true;}}printf("\n");}int cmp(char s,char s1){if(s > s1) //如果最高位不同{return 1;}else if((s < s1)){return -1;}else if(s == s1) //最高位相同{int k = 0;while(s == s1 && k < strlen(s)) //这个地方表示相同则一直向后走,k++;/*这被注释掉两个语句出现的原因是刚开始考虑的是此时的s != s1,所以要回退一下,因此如果两个数字完全相同的话,k 会退后就是 strlen(s) - 1,不是strlen(s)但是下面的操作直接是从不相等的部分开始的,所以没有必要回退*///k --; //if(k == strlen(s1) - 1) if(k == strlen(s)) //可能有两个数字相等的情况。return 0;else if(s > s1)return 1;elsereturn -1;}}int main(){char str;char str1;int time = 0;freopen("in.txt","r",stdin);scanf("%d",&time);for(int i=0;i<time;i++){memset(str,'\0',sizeof(str));memset(str1,'\0',sizeof(str1));scanf("%s",str);int j = 0;int len = strlen(str);while(j< len){if(code - '0'] == -1)break;str1 = code - '0'] + '0';j ++;}if(j < len){printf("ERROR\n");continue;}switch(cmp(str,str1)){case 0:printf("0\n");break;case -1:{minus(str1,str);break;}case 1:minus(str,str1);break;}}return 0;}/*int main() //这个方案是错误的是因为没有考虑大数的问题{int time;int num;freopen("in.txt","r",stdin);scanf("%d",&time);for(int i=0;i<time;i++){scanf("%d",&num);int tmpNum = num,newNum =0,tmp;int j = 0;while(tmpNum != 0){if( code== -1)break;newNum = code + newNum * 10;j++;tmpNum = tmpNum /10;}if(tmpNum != 0)printf("ERROR\n");else if(num > newNum)printf("%d\n",num - newNum);elseprintf("%d\n",newNum - num);}fclose(stdin);return 0;}*/ 水题一个,对我来说关键的是 边界条件的检查
页: [1]
查看完整版本: joj 2749 大数比较大小与减法