鱼C论坛

 找回密码
 立即注册
查看: 1011|回复: 4

[已解决]求助

[复制链接]
发表于 2022-1-20 20:44:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给出一个正整数 n(n\le 100)n(n≤100),然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2。经过若干次循环后,最终都会回到 1。经过验证很大的数字(7\times10^{11}7×10
11
)都可以按照这样的方式比变成 1,所以被称为“冰雹猜想”。例如当 nn 是 20,变化的过程是 [20, 10, 5, 16, 8, 4, 2, 1]。

根据给定的数字,验证这个猜想,并从最后的 1 开始,倒序输出整个变化序列。
#include <stdio.h>
int main()
{
        int a[100],i=0;
        scanf("%d", &a[0]);
        for(;a[i]==1;i++)
        {
                if (a[i] % 2 == 0)
                        a[i+1] =a[i]/2;
                else
                        a[i+1] = a[i] * 3 + 1;
        }
        for (; i >= 0; i--)
                printf("%d", a[i]);
        return 0;
}
为什么只输出了20?
最佳答案
2022-1-21 10:17:59
方法 1:
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. struct Node{
  4.         int val;
  5.         struct Node *next;
  6. };

  7. int main(){
  8.         struct Node *head = NULL, *tail;
  9.         int n, m;
  10.         scanf("%d", &n);
  11.         m = n;
  12.         do{
  13.                 n = n%2 ? n*3+1 : n/2;
  14.                 tail = head;
  15.                 head = (struct Node*)malloc(sizeof(struct Node));
  16.                 head->val = n;
  17.                 head->next = tail;
  18.         }while(n != 1);
  19.         while(head){
  20.                 printf("%d ", head->val);
  21.                 head = head->next;
  22.         }
  23.         printf("%d ", m);
  24.         return 0;
  25. }
复制代码
方法 2:
  1. #include <stdio.h>

  2. void CollatzConjecture(int n){
  3.         if(n == 1){
  4.                 printf("%d ", n);
  5.                 return;
  6.         }
  7.         CollatzConjecture(n%2 ? n*3+1 : n/2);
  8.         printf("%d ", n);
  9. }

  10. int main(){
  11.         int n;
  12.         scanf("%d", &n);
  13.         CollatzConjecture(n);
  14.         return 0;
  15. }
复制代码
输入/输出:
  1. 27
  2. 1 2 4 8 16 5 10 20 40 80 160 53 106 35 70 23 46 92 184 61 122 244 488 976 325 650 1300 433 866 1732 577 1154 2308 4616 9232 3077 6154 2051 4102 1367 2734 911 1822 3644 7288 2429 4858 1619 3238 1079 2158 719 1438 479 958 319 638 1276 425 850 283 566 1132 377 754 251 502 167 334 668 1336 445 890 1780 593 1186 395 790 263 526 175 350 700 233 466 155 310 103 206 412 137 274 91 182 364 121 242 484 161 322 107 214 71 142 47 94 31 62 124 41 82 27
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-20 21:02:17 | 显示全部楼层
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int a[100],i=0;
  5.         scanf("%d", &a[0]);
  6.         for(;a[i]!=1;i++) // 条件写错了
  7.         {
  8.                 if (a[i] % 2 == 0)
  9.                         a[i+1] =a[i]/2;
  10.                 else
  11.                         a[i+1] = a[i] * 3 + 1;
  12.         }
  13.         for (; i >= 0; i--)
  14.                 printf("%d ", a[i]);
  15.         return 0;
  16. }
  17.   
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-20 22:56:52 | 显示全部楼层
你for循环里面的条件是a[i]==1,显然写错了,你输入20,第一次执行肯定不等于1,所以for循环就没进去,当然就只有一个20了。
改为a[i]!=1就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-21 09:39:04 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-21 09:40 编辑

数组最多可以存放 100 个元素也是错的。
题目给定n <= 100,设 n = 27 试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-21 10:17:59 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
方法 1:
  1. #include <stdio.h>
  2. #include <malloc.h>

  3. struct Node{
  4.         int val;
  5.         struct Node *next;
  6. };

  7. int main(){
  8.         struct Node *head = NULL, *tail;
  9.         int n, m;
  10.         scanf("%d", &n);
  11.         m = n;
  12.         do{
  13.                 n = n%2 ? n*3+1 : n/2;
  14.                 tail = head;
  15.                 head = (struct Node*)malloc(sizeof(struct Node));
  16.                 head->val = n;
  17.                 head->next = tail;
  18.         }while(n != 1);
  19.         while(head){
  20.                 printf("%d ", head->val);
  21.                 head = head->next;
  22.         }
  23.         printf("%d ", m);
  24.         return 0;
  25. }
复制代码
方法 2:
  1. #include <stdio.h>

  2. void CollatzConjecture(int n){
  3.         if(n == 1){
  4.                 printf("%d ", n);
  5.                 return;
  6.         }
  7.         CollatzConjecture(n%2 ? n*3+1 : n/2);
  8.         printf("%d ", n);
  9. }

  10. int main(){
  11.         int n;
  12.         scanf("%d", &n);
  13.         CollatzConjecture(n);
  14.         return 0;
  15. }
复制代码
输入/输出:
  1. 27
  2. 1 2 4 8 16 5 10 20 40 80 160 53 106 35 70 23 46 92 184 61 122 244 488 976 325 650 1300 433 866 1732 577 1154 2308 4616 9232 3077 6154 2051 4102 1367 2734 911 1822 3644 7288 2429 4858 1619 3238 1079 2158 719 1438 479 958 319 638 1276 425 850 283 566 1132 377 754 251 502 167 334 668 1336 445 890 1780 593 1186 395 790 263 526 175 350 700 233 466 155 310 103 206 412 137 274 91 182 364 121 242 484 161 322 107 214 71 142 47 94 31 62 124 41 82 27
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表