首页 > 代码库 > HDU 1002(AC代码)
HDU 1002(AC代码)
1 #include <stdio.h> 2 #include <string.h> 3 #define MAX 1009 4 int main() 5 { 6 char a[MAX]={0},b[MAX]={0}; 7 int n,i,len1,len2,j=0,z=0,r=0,k=0; 8 char *p=NULL; 9 scanf("%d",&n); 10 if( 0<n&&n<21 ){11 for(i=0;i<n;i++){12 j=0;13 z=0;14 r=0;15 scanf("%s",a);16 scanf("%s",b);17 printf("Case %d:\n",i+1);18 printf("%s + %s = ",a,b);19 len1=strlen(a);20 len2=strlen(b);21 if( len1>len2 ){22 b[len1]=‘\0‘;23 len1--;24 len2--;25 while( len2>=0 ){26 b[len1--]=b[len2--];27 }28 while(len1>=0){29 b[len1--]=‘0‘;30 }31 }32 else if( len2>len1 ){33 a[len2]=‘\0‘;34 len1--;35 len2--;36 while( len1>=0 ){37 a[len2--]=a[len1--];38 }39 while(len2>=0){40 a[len2--]=‘0‘;41 }42 }43 len1=strlen(a);44 len2=strlen(b);45 len1--;46 len2--;47 while( len1>=0 && len2>=0 ) {48 z= (b[len2]-‘0‘) + (a[len1]-‘0‘) + r; 49 r=z/10;50 z=z-r*10;51 b[len2]=z+‘0‘;52 len1--;53 len2--;54 };55 if( r!=0 ){56 printf("1");57 printf("%s\n",b); 58 }59 else{60 len2=strlen(b);61 while( b[k]==‘0‘&&k<len2 ){62 k++;63 }64 p=&b[k];65 printf("%s\n",p);66 }67 if(i!=n-1)68 printf("\n");69 70 }71 }72 return 0;73 }
格式很重要:
Case+空格+i+:(冒号后无空格)
a+空格+b+空格+=+空格+c(直接把+号去掉,再按空格键代替空格)
(空一行)
<<-继续上面格式->>
注意:最后一个case输完后是不需要空行的,所以会有代码
if(i!=n-1) printf("\n"); //当非最后一个case时,输出一个空行
解题思路:
1、数字可能太大,得用数组逐个记下来,第一个存在a,另一个存在b。
2、strlen算它们各自的长度(strlen不计算‘\0‘),从数组的第strlen个开始
3、相加之后要考虑是否需要进一位,需要的话把十位上数字提出来,提取出来和第strlen-1的那两个数相加。
4、刚被提取个位上的数字存到长度较长的数组中,节省点空间。
5、一直重复。
要注意:
输入可能是00001 00002,那么你要输出3,不能是00003。
输入可能是99999 99998,那么考虑进位时,因两个数组一样长,所以可能进位会填不进数组,要单独输出。
输入可能是99999 1,那么也是考虑进位的问题。
输入可能是1 9999,也是进位问题,要考虑不同长度的数字的前后顺序。
HDU 1002(AC代码)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。