PTA作业的难题!!!
问题如下:卡拉兹(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们!!!
{:5_103:}
{:5_104:} 你的代码中有一个错误,原因是在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。
希望对你有所帮助!
如果问题已经解决,请设置最佳答案 你的代码中有几个问题:首先,你在输出结果时使用了变量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;
}
根据你提供的代码,可能出现以下两个问题:
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;
}
希望这个答案对你有帮助。如果你还有其他问题,请随时提出。
页:
[1]