|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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?
方法 1: - #include <stdio.h>
- #include <malloc.h>
- struct Node{
- int val;
- struct Node *next;
- };
- int main(){
- struct Node *head = NULL, *tail;
- int n, m;
- scanf("%d", &n);
- m = n;
- do{
- n = n%2 ? n*3+1 : n/2;
- tail = head;
- head = (struct Node*)malloc(sizeof(struct Node));
- head->val = n;
- head->next = tail;
- }while(n != 1);
- while(head){
- printf("%d ", head->val);
- head = head->next;
- }
- printf("%d ", m);
- return 0;
- }
复制代码方法 2: - #include <stdio.h>
- void CollatzConjecture(int n){
- if(n == 1){
- printf("%d ", n);
- return;
- }
- CollatzConjecture(n%2 ? n*3+1 : n/2);
- printf("%d ", n);
- }
- int main(){
- int n;
- scanf("%d", &n);
- CollatzConjecture(n);
- return 0;
- }
复制代码输入/输出: - 27
- 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
复制代码
|
|