把一个正整数变为1,求最少的步数?具体是这样的,如果这个数是偶数,那么直接除2,如果是奇数,加1或减1后再除2,这样反复,一直到变为1,求最少需要几步? #include <stdio.h> #include <malloc.h> int min ; //穷搜方法的最终答案 typedef struct node { int val; struct node *a, *b, *c; } NODE; void creat(NODE * head, int n) { NODE *p; if(n == 1) { if(head->val < min) min = head->val; return ; } if(n%2 == 0) { p = (NODE *)malloc(sizeof(NODE)); p->a = NULL; p->b = NULL; p->c = NULL; p->a = p; p->val = head->val + 1; creat(p,n/2); } else { p = (NODE *)malloc(sizeof(NODE)); p->a = NULL; p->b = NULL; p->c = NULL; head->b = p; p->val = head->val + 1; creat(p,n+1); p = (NODE *)malloc(sizeof(NODE)); p->a = NULL; p->b = NULL; p->c = NULL; head->c = p; p->val = head->val + 1; creat(p,n-1); } } // int count; int f(unsigned int x) { if(x == 1) return count; if(x == 3) { count += 2; return count; } if(x%2 == 0) { f(x/2); count++; } else { if((x+1)%4 == 0) f((x+1)/4); else f((x-1)/4); count += 3; } } / int main() { int x; NODE *head; min = 10000; head = (NODE *)malloc(sizeof(NODE)); head->a = NULL; head->b = NULL; head->c = NULL; head->val = 0; //scanf("%d",&x); //creat(head,x); //printf("/n%d",min); for(int i = 1; i < 1000; i++) { min = 10000; count = 0; creat(head,i); if(f(i) != min) { printf("/nERROR/n"); printf("f(%d) = %d, min = %d",i,f(i), min); break; } } printf("/nno news is good news!/n"); return 0; }