| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6443 人关注过本帖, 1 人收藏
标题:求助!!3n+1 问题怎么做?
只看楼主 加入收藏
blueradix
Rank: 1
等 级:新手上路
帖 子:1
专家分:3
注 册:2011-3-30
收藏
得分:3 
要努力啊,自己认真做过的才是收获最多的!
2011-04-04 21:48
安然之风
Rank: 2
等 级:论坛游民
帖 子:43
专家分:23
注 册:2011-1-6
收藏
得分:0 
真不是作业!
我的问题就是输入987654321(在10^9内),是合法数据,但结果却是意外的!第一次输出为-1332004332,它不大于1,。所以循环终止。
对于这个乘法溢出了,怎么解决?
还得请大侠们出手相助!!
#include<stdio.h>
int main(){
  int n, count = 0;
  scanf("%d", &n);
  while(n > 1) {
    if(n % 2 == 1) n = n*3+1;
    else n /= 2;
    count++;
printf("%d\n",n);
  }
  printf("%d\n", count);
  return 0;
}
2011-04-04 23:53
安然之风
Rank: 2
等 级:论坛游民
帖 子:43
专家分:23
注 册:2011-1-6
收藏
得分:0 
谢谢各位的帮忙!!
我明白了。
这样就行了:
#include<stdio.h>
//#include<time.h>
#define MAX 1000000000
int main()
{
   double n;
  int count = 0;
  scanf("%lf", &n);
  if(n>1&& n<=MAX)
  {
     while(n > 1)
     {
        if((int)n % 2 == 1) n = n*3+1;
        else n /= 2;
         count++;
        printf("%.0lf\n",n);
     }
    printf("%d\n", count);
  }
 // printf("time used = %.8f\n",(double)clock()/CLOCKS_PER_SEC);
  return 0;
}








2011-04-05 00:31
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
嗨,原来你只用算一个数。我还以为你再做某些OJ的题呢,普遍都会要求算一个区间内有所有数,生算的话速度会很慢。

就一个数用什么方法都行。10^9 以内的任意数,用不了 1000 来次就都能归一。算法不重要。
long long 一般不会溢出的,它的上限是 9223372036854775807。如果你愿意用无符号的话还可以大一倍 18446744073709551615。
2011-04-05 11:31
安然之风
Rank: 2
等 级:论坛游民
帖 子:43
专家分:23
注 册:2011-1-6
收藏
得分:0 
回复 14楼 pangding
谢谢你的关注!
最近是在做某些OJ题,但在从中想把更多的细节错误避免。
所以还要继续向各位高手取经!!
恳请各位的批评指出!
不胜感激!!
2011-04-05 14:31
jackboos
Rank: 2
等 级:论坛游民
帖 子:21
专家分:37
注 册:2011-4-6
收藏
得分:3 
#include<stdio.h>

int ch(int a)
{
    if(a!=1)
    {
        if(a%2==1)
        {
            a=3*a+1;
        }
        else
        {
            a/=2;
        }
        printf("%d\n",a);
        ch(a);
    }
    else
            return a;
}

void main()
{
    int a;
    printf("Input one number:");
    scanf("%d",&a);
    if(a<1)
    {
        printf("You need to input a natural number!Please reinput:");
        scanf("%d",&a);
    }
    ch(a);
    getch();
}

经典递归
2011-04-06 23:55
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
感觉这个可不经典……
2011-04-07 09:05
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
int f(int i,int j)
{if(i%2==1)
{i=3*i+1;
j++;}
else {i=i/2;j++;}
if(i==1)
printf("%d",j);
else f(i,j);}
main()
{int i,j=0;
scanf("%d",&i);
f(i,j);
getch();
}
2011-04-08 07:59
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
程序代码:
// 当 n 为奇数时

   (3 * n + 1) / 2
== (n + n + n + 1) / 2
== (n + n + n + 3) / 2 - 1
== (n + 1) * 3 / 2 - 1
== (n + 1) + (n + 1) / 2 - 1
== n + ((n + 1) >> 1)
== n + (n >> 1) + 1

// 由此可以把 3 * n + 1 和接下来的 n / 2 合并为一次运算,运算次数加 2
// 大家检查一下,应该没错吧


[ 本帖最后由 voidx 于 2011-4-8 16:23 编辑 ]
2011-04-08 13:46
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 19楼 voidx
真是好想法。这种优化真是无微不至。

不过感觉 voidx 推这个兜的圈子有点远呀。
(3n+1)/2 = n + n/2 + 1/2 = n + (n-1)/2 + 1
到这都对吧?
n 是奇数,n >> 1 就是 (n-1)/2
这样推是不是容易一点。


[ 本帖最后由 pangding 于 2011-4-8 22:20 编辑 ]
2011-04-08 22:14
快速回复:求助!!3n+1 问题怎么做?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016857 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved