鱼C论坛

 找回密码
 立即注册
查看: 1548|回复: 3

[已解决]PTA作业的难题!!!

[复制链接]
发表于 2023-9-30 16:48:07 | 显示全部楼层 |阅读模式

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

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

x
问题如下:
  1. 卡拉兹(Callatz)猜想:

  2. 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

  3. 我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

  4. 输入格式:
  5. 每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

  6. 输出格式:
  7. 输出从 n 计算到 1 需要的步数。
复制代码



我的代码:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int n,m;
  5.         int count = 0;
  6.         scanf("%d",&n);
  7.         m = n;
  8.         while(n != 1)
  9.         {
  10.                 if(n/2 != 0)
  11.                 {
  12.                         n = (3*n+1)/2;
  13.                 }
  14.                 else
  15.                 {
  16.                         n = n/2;
  17.                 }
  18.                 count = count + 1;       
  19.         }
  20.         printf("只要%d刀就把%d变成1了",count,n);
  21.         return 0;
  22. }
  23.        
复制代码


根本运行不了怎么回事,giegie们!!!

最佳答案
2023-9-30 16:48:18
你的代码中有几个问题:首先,你在输出结果时使用了变量n,而此时n已经等于1,应该使用最开始输入的m;其次,你在判断n是否为偶数时使用了n/2 != 0,实际上应该使用n%2 == 0;最后,你没有在输出语句中加上换行符,导致输出结果与提示语在同一行。下面是修改后的代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int n, m;
  5.     int count = 0;
  6.     scanf("%d", &n);
  7.     m = n;
  8.     while (n != 1)
  9.     {
  10.         if (n % 2 == 0)
  11.         {
  12.             n = n / 2;
  13.         }
  14.         else
  15.         {
  16.             n = (3 * n + 1) / 2;
  17.         }
  18.         count = count + 1;
  19.     }
  20.     printf("只要%d刀就把%d变成1了\n", count, m);
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-30 16:48:17 | 显示全部楼层
你的代码中有一个错误,原因是在while循环中,你判断n是否等于1来决定是否继续执行循环,但是循环中n的值会发生改变,所以你应该将计数器count的初始化放在输入n之后,在while循环中对n进行操作,并每次更新count的值,直到n等于1为止。

以下是修改后的代码:

  1. #include <stdio.h>

  2. int main(){
  3.     int n,m;
  4.     int count = 0;
  5.     scanf("%d",&n);
  6.     m = n; // 保存原始的n值
  7.     while(n != 1){
  8.         if(n % 2 == 1){ // 如果n是奇数
  9.             n = (3*n+1) / 2;
  10.         }else{ // 如果n是偶数
  11.             n = n / 2;
  12.         }
  13.         count = count + 1;
  14.     }
  15.     printf("只要%d刀就把%d变成1了",count,m); // 打印原始的n值m
  16.     return 0;
  17. }
复制代码


在代码中,我们先使用scanf函数读入n,然后用m保存原始的n值。接下来,在while循环中,我们判断n的奇偶性,如果是奇数,则执行砍掉一半的操作(即(3n+1)/2),否则执行砍掉一半的操作(即n/2),每次操作后更新count的值。最后,我们打印出原始的n值m和需要砍的次数count。

希望对你有所帮助!
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:48:18 | 显示全部楼层    本楼为最佳答案   
你的代码中有几个问题:首先,你在输出结果时使用了变量n,而此时n已经等于1,应该使用最开始输入的m;其次,你在判断n是否为偶数时使用了n/2 != 0,实际上应该使用n%2 == 0;最后,你没有在输出语句中加上换行符,导致输出结果与提示语在同一行。下面是修改后的代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int n, m;
  5.     int count = 0;
  6.     scanf("%d", &n);
  7.     m = n;
  8.     while (n != 1)
  9.     {
  10.         if (n % 2 == 0)
  11.         {
  12.             n = n / 2;
  13.         }
  14.         else
  15.         {
  16.             n = (3 * n + 1) / 2;
  17.         }
  18.         count = count + 1;
  19.     }
  20.     printf("只要%d刀就把%d变成1了\n", count, m);
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:52:44 | 显示全部楼层
根据你提供的代码,可能出现以下两个问题:

1. 语法错误:在 if-else 语句中,应该判断 n 是否为偶数,即判断 n % 2 是否等于 0,而不是 n/2 是否不等于 0。

2. 输出错误:在输出语句中,应该输出转换前的原数 m,而不是最终转换结果 n。

下面是修改后的代码:


  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int n,m;
  5.         int count = 0;
  6.         scanf("%d",&n);
  7.         m = n;
  8.         while(n != 1)
  9.         {
  10.                 if(n % 2 == 0)  // 修改判断条件
  11.                 {
  12.                         n = n / 2;
  13.                 }
  14.                 else
  15.                 {
  16.                         n = (3*n + 1) / 2;
  17.                 }
  18.                 count += 1;      
  19.         }
  20.         printf("只要%d刀就把%d变成1了",count,m);  // 修改输出内容
  21.         return 0;
  22. }
复制代码


希望这个答案对你有帮助。如果你还有其他问题,请随时提出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 05:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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