免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zephyr82
打印 上一主题 下一主题

[求助] 有点难度D,请老大们指点 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2003-01-18 20:44 |只看该作者

[求助] 有点难度D,请老大们指点

无双说有就是有!
偶刚刚试了一下,最长到19位。

论坛徽章:
0
22 [报告]
发表于 2003-01-18 20:46 |只看该作者

[求助] 有点难度D,请老大们指点

在linux下有
long long

另外可以自己改写atol


如果真的想输入任意长的数的话
那么就要另外定义算法了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2003-01-18 20:50 |只看该作者

[求助] 有点难度D,请老大们指点

原帖由 "无双" 发表:
在linux下有
long long

原来如此~~~~~~~~~~

论坛徽章:
0
24 [报告]
发表于 2003-01-18 20:57 |只看该作者

[求助] 有点难度D,请老大们指点

我刚刚试了,XP下也会工作D,
偶将偶的代码的int 都改成 long long后,能算出3565的LEVEL了,是21
如果LEVEL 更高怎么办,还是会处溢出的。

论坛徽章:
0
25 [报告]
发表于 2003-01-18 21:00 |只看该作者

[求助] 有点难度D,请老大们指点

flw,能不能简单介绍一下数据结构,谢谢
我QQ注册不上,提示说太忙~~~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
26 [报告]
发表于 2003-01-18 21:57 |只看该作者

[求助] 有点难度D,请老大们指点

我马上就要写好了。

论坛徽章:
0
27 [报告]
发表于 2003-01-18 22:01 |只看该作者

[求助] 有点难度D,请老大们指点

谢谢老大!
永远支持老大!
还是单独发一个帖子吧,好让更多的人学习D

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
28 [报告]
发表于 2003-01-18 22:35 |只看该作者

[求助] 有点难度D,请老大们指点

终于做出来了!
大家顺便帮我测试一下、优化一下。
  1. # include <stdio.h>;
  2. # include <stdlib.h>;
  3. # include <string.h>;
  4. # include <conio.h>;

  5. # define MAX_LEN 1000

  6. int XAdd( char *p, char *a, char *b ); //将 a 和 b 相加, 结果存放在 p 中
  7. void XChange( char *a, char *b ); //将 a 倒置,存入 b 中。

  8. void main( void )
  9. {
  10.         char *a = NULL, *b = NULL, *p = NULL;
  11.         int ch, i, level = 0;

  12.         a = (char *)malloc( sizeof(char) * (MAX_LEN+1) );
  13.         b = (char *)malloc( sizeof(char) * (MAX_LEN+1) );
  14.         p = (char *)malloc( sizeof(char) * (MAX_LEN+1) );

  15.         if ( a == NULL || b == NULL || p == NULL )
  16.         {
  17.                 fprintf( stderr, "Malloc memory failed!\n" );

  18.                 if ( a ) free(a);
  19.                 if ( b ) free(b);
  20.                 if ( p ) free(p);

  21.                 return;
  22.         }

  23.         memset( a, 0x00, MAX_LEN+1 );
  24.         memset( b, 0x00, MAX_LEN+1 );
  25.         memset( p, 0x00, MAX_LEN+1 );

  26.         fprintf( stderr, "Input: " );
  27.         i = 0;
  28.         while( i < MAX_LEN )
  29.         {
  30.                 ch = getch();
  31.                 if ( ch < '0' || ch >; '9' )
  32.                         break;
  33.                 a[i++] = ch;
  34.                 fprintf( stderr, "%c", ch );
  35.         }

  36.         fprintf( stderr, "\nYou input is: [%s]\n", a );

  37.         while( XChange( a, b ), strcmp( a, b ) )
  38.         {
  39.                 if ( XAdd( p, a, b ) )
  40.                         break;
  41.                 fprintf( fp, "%s + %s = %s\n", a, b, p );
  42.                 strcpy( a, p );
  43.                 level ++;
  44.         }

  45.         fprintf( stderr, "LEVEL: [%d]\n", level );

  46.         free( a );
  47.         free( b );
  48.         free( p );

  49.         return ;
  50. }

  51. void XChange( char *a, char *b )
  52. {
  53.         int len, i;

  54.         len = strlen(a);
  55.         b[len-1] = 0;
  56.         for( i=0; i<len; i++ )
  57.                 b[len - i - 1] = a[i];
  58.         return;
  59. }

  60. int XAdd( char *p, char *a, char *b )
  61. {
  62.         int la, lb, i, carry=0, k;
  63.         char temp[MAX_LEN+1];

  64.         memset(temp, 0x00, MAX_LEN+1);
  65.         la = strlen( a );
  66.         lb = strlen( b );

  67. // 考虑溢出.
  68.         if ( (la>;lb?la:(lb>;la?lb:lb+1) >; MAX_LEN && a[0]+b[0] >; 8+2*'0' )
  69.                 return 1;

  70. // 下面就象小学生做算术一样。一定要考虑到进位
  71.         for( i=0; la>;0 && lb>;0; i++, la--, lb-- )
  72.         {
  73.                 temp[i] = a[la-1] + b[lb-1] - '0' + carry;
  74.                 if ( temp[i] >; '9' )
  75.                 {
  76.                         temp[i] -= 10;
  77.                         carry = 1;
  78.                 }
  79.                 else
  80.                         carry = 0;
  81.         }

  82. // 如果还有没对齐的部分,要照抄过来,注意 carry,一定要考虑到进位
  83.         while( la >; 0 )
  84.         {
  85.                 temp[i] = a[la---1] + carry;
  86.                 if ( temp[i] >; '9' )
  87.                 {
  88.                         temp[i] -= 10;
  89.                         carry = 1;
  90.                 }
  91.                 else
  92.                         carry = 0;
  93.                 i++;
  94.         }

  95.         while( lb >; 0 )
  96.         {
  97.                 temp[i] = b[lb---1] + carry;
  98.                 if ( temp[i] >; '9' )
  99.                 {
  100.                         temp[i] -= 10;
  101.                         carry = 1;
  102.                 }
  103.                 else
  104.                         carry = 0;
  105.                 i++;
  106.         }

  107.         temp[i] = carry + '0';

  108. // 下面这个循环去除高位的 ‘0’
  109.         while( temp[i] == '0' )
  110.                 i--;

  111. // 由于 temp 中的内容是高位在后,所以要倒置一下。
  112.         for( k=0; i>;=0; i--, k++ )
  113.                 p[k] = temp[i];

  114.         p[k] = 0;

  115.         return 0;
  116. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2003-01-18 22:37 |只看该作者

[求助] 有点难度D,请老大们指点

运行结果如下:
  1. Input:

  2. You input is: [3565]
  3. 3565 + 5653 = 9218
  4. 9218 + 8129 = 17347
  5. 17347 + 74371 = 91718
  6. 91718 + 81719 = 173437
  7. 173437 + 734371 = 907808
  8. 907808 + 808709 = 1716517
  9. 1716517 + 7156171 = 8872688
  10. 8872688 + 8862788 = 17735476
  11. 17735476 + 67453771 = 85189247
  12. 85189247 + 74298158 = 159487405
  13. 159487405 + 504784951 = 664272356
  14. 664272356 + 653272466 = 1317544822
  15. 1317544822 + 2284457131 = 3602001953
  16. 3602001953 + 3591002063 = 7193004016
  17. 7193004016 + 6104003917 = 13297007933
  18. 13297007933 + 33970079231 = 47267087164
  19. 47267087164 + 46178076274 = 93445163438
  20. 93445163438 + 83436154439 = 176881317877
  21. 176881317877 + 778713188671 = 955594506548
  22. 955594506548 + 845605495559 = 1801200002107
  23. 1801200002107 + 7012000021081 = 8813200023188
  24. LEVEL: [21]
复制代码

论坛徽章:
0
30 [报告]
发表于 2003-01-18 22:44 |只看该作者

[求助] 有点难度D,请老大们指点

看8懂,偶太菜了!
简单解释一下可以吗?
老大辛苦了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP