免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5319 | 回复: 50
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-18 16:40 |只看该作者 |倒序浏览
写了一段程序,是做如下事D
   input:        12
       do:        12+21=33         
output:        LEVEL=1

   input:        78
       do:        78+87=165
                    165+561=726
                    726+627=1353
                    1353+3531=4884
  output:       LEVEL=4

就是keep repeating "reverse and add". 当结果是一种数如:1,22,343,567765 时,就结束,并输出LEVEL,也就是加了多少次。

程序已经写好了,不过如果LEVEL太高的话,我写的程序就不动了。
而题目的要求是对任何size的integer都能工作。
如输入3656,它就不动了。
请老大们指点。






#include<iostream>;
using namespace std;
int digists(int);
int f(int);
int reserve(int);
int main()
{
  int n,r,level=0;
  cout<<"lease enter a value: ";
  cin>;>;n;
  while(reserve(n)!=n)
  {  
     r=reserve(n);
     n=n+r;
     level++;
  }   
  cout<<"The level is "<<level<<endl;
}  

int reserve(int a)
{
   int b=0,c=0,d;
   d=digists(a);
   for(;a!=0
   {   
      while(a%10!=0)
      {
         a--;
         b++;
      }
      c=c+b*f(d);
      a=a/10;
      b=0;
      d--;
   }
   return c;     
}

int digists(int x)
{
  int digists=0;
  while(x!=0)
  {
    x=x/10;
    digists++;
  }
  return digists;
}

int f(int x)
{
  int y=1;
  if(x==1) return y;
  for(;x>;1;x--)
  y=y*10;
  return y;
}

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

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

晕啊!怎么回有一个;)在哪呢
我打的是;)

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

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

  1. # include <iostream.h>;
  2. # include <stdio.h>;
  3. # include <stdlib.h>;
  4. # include <string.h>;

  5. long reserve( long );

  6. void main( void )
  7. {
  8.         long n,r,level=0;

  9.         cout<<"Please enter a value: ";
  10.         cin>;>;n;

  11.         while( (r=reserve(n))!=n )
  12.         {
  13.                 fprintf( stderr, "%lu + %lu ", n, r );
  14.                 n=n+r;
  15.                 fprintf( stderr, "= %lu\n", n );
  16.                 level++;
  17.         }
  18.         cout<<"The level is "<<level<<endl;
  19. }

  20. long reserve(long a)
  21. {
  22.         char tmpStr[20];
  23.         int len, t;

  24.         sprintf( tmpStr, "%lu", a );
  25.         len = strlen(tmpStr);
  26.         for( int i=0; i<len/2; i++ )
  27.         {
  28.                 t = tmpStr[i];
  29.                 tmpStr[i] = tmpStr[len-i-1];
  30.                 tmpStr[len-i-1] = t;
  31.         }

  32.         return atol(tmpStr);
  33. }
复制代码

这样就可以了。
建议:做程序之前先好好想想,优化一下算法,不要光盯着结果。
你的程序为什么不行?就是由于算法过于复杂,多余的循环太多。
不过也许还有其它原因,我也就懒得查了。

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

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

比如:
  1. int f(int x)
  2. {
  3.     int y=1;
  4.     if(x==1)
  5.         return y;
  6.     for(;x>;1;x--)
  7.         y=y*10;
  8.     return y;
  9. }
复制代码

就可以简化成:
  1. int f(int x)
  2. {
  3.     return 10 ^ (x-1);
  4. }
复制代码

自已好好看看吧!

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

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

flw
8正确啊! 就是8正确~~~~~~~~~~~`
输入3565
算到1317544822+2284457131=3602001953
后一个等式是3602001953+3591002063=2898036720 错D

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

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

写代码时用
  1.   
  2. 代码
复制代码


我先用tc调试一下先

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

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

那是由于溢出了,但我的算法是对的,要想不溢出,就得自已设计
数据结构 ---- 不过这些你肯定是听不进去的。
[quote]原帖由 "flw"]不要光盯着结果。[/quote 发表:

唉!不怕不会,就怕指不到人路上呀!

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

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

我就是想知道怎么才能不溢出!
可以讲讲吗??

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

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

调试正常
使用tc3.0

flw
对齐后的代码调试

你自己调试看看
另外

  1.    cout<<"Please enter a value: ";
  2.    cin>;>;n;

  3.    while( (r=reserve(n))!=n )
  4.    {
  5.       fprintf( stderr, "%lu + %lu ", n, r );
  6.       n=n+r;
  7.       fprintf( stderr, "= %lu\n", n );
  8.       level++;
  9.    }
  10.    
复制代码

改成


  1.    while( (r=reserve(n))!=n )
  2.    {

  3.       fprintf( stderr, "%lu + %lu ", n, r );
  4.       n=n+r;
  5.       fprintf( stderr, "= %lu\n", n );
  6.       level++;

  7.    cout<<"Please enter a value: ";
  8.    cin>;>;n;

  9.    }
  10.    
复制代码


不然只是循环
而不是每次显示完后让你再次输入值

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

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

这就涉及到另一个话题:如何进行大数的加法运算了。由于系统自带的数据类型
长度肯定有不够用的时候,所以要想从根本上解决这个问题,就必须自行设计新
的数据类型。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP