鱼C论坛

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

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

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

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

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

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

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

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

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

输出格式:
输出从 n 计算到 1 需要的步数。


我的代码:
#include <stdio.h>
int main()
{
        int n,m;
        int count = 0; 
        scanf("%d",&n);
        m = n;
        while(n != 1)
        {
                if(n/2 != 0)
                {
                        n = (3*n+1)/2;
                }
                else
                {
                        n = n/2;
                }
                count = count + 1;        
        }
        printf("只要%d刀就把%d变成1了",count,n);
        return 0;
}
        

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

最佳答案
2023-9-30 16:48:18
你的代码中有几个问题:首先,你在输出结果时使用了变量n,而此时n已经等于1,应该使用最开始输入的m;其次,你在判断n是否为偶数时使用了n/2 != 0,实际上应该使用n%2 == 0;最后,你没有在输出语句中加上换行符,导致输出结果与提示语在同一行。下面是修改后的代码:
#include <stdio.h>
int main()
{
    int n, m;
    int count = 0;
    scanf("%d", &n);
    m = n;
    while (n != 1)
    {
        if (n % 2 == 0)
        {
            n = n / 2;
        }
        else
        {
            n = (3 * n + 1) / 2;
        }
        count = count + 1;
    }
    printf("只要%d刀就把%d变成1了\n", count, m);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

以下是修改后的代码:
#include <stdio.h>

int main(){
    int n,m;
    int count = 0;
    scanf("%d",&n);
    m = n; // 保存原始的n值
    while(n != 1){
        if(n % 2 == 1){ // 如果n是奇数
            n = (3*n+1) / 2;
        }else{ // 如果n是偶数
            n = n / 2;
        }
        count = count + 1;
    }
    printf("只要%d刀就把%d变成1了",count,m); // 打印原始的n值m
    return 0;
}

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

希望对你有所帮助!
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 16:48:18 | 显示全部楼层    本楼为最佳答案   
你的代码中有几个问题:首先,你在输出结果时使用了变量n,而此时n已经等于1,应该使用最开始输入的m;其次,你在判断n是否为偶数时使用了n/2 != 0,实际上应该使用n%2 == 0;最后,你没有在输出语句中加上换行符,导致输出结果与提示语在同一行。下面是修改后的代码:
#include <stdio.h>
int main()
{
    int n, m;
    int count = 0;
    scanf("%d", &n);
    m = n;
    while (n != 1)
    {
        if (n % 2 == 0)
        {
            n = n / 2;
        }
        else
        {
            n = (3 * n + 1) / 2;
        }
        count = count + 1;
    }
    printf("只要%d刀就把%d变成1了\n", count, m);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

下面是修改后的代码:

#include <stdio.h>
int main()
{
        int n,m;
        int count = 0;
        scanf("%d",&n);
        m = n;
        while(n != 1)
        {
                if(n % 2 == 0)  // 修改判断条件
                {
                        n = n / 2;
                }
                else
                {
                        n = (3*n + 1) / 2;
                }
                count += 1;       
        }
        printf("只要%d刀就把%d变成1了",count,m);  // 修改输出内容
        return 0;
}

希望这个答案对你有帮助。如果你还有其他问题,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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