public static void main(String[] args) {
int count = 0;
for (int i = 100; i <= 999; i++) {
double result = 0;
for (int j = 0; j < 3; j++) {
result = result + Math.pow(i % 10, 3);
i = i / 10;
}
if (result == i) {
count++;
}
}
System.out.println("水仙花数有 : " + count + "个");
}
因为你 内循环 改变了 i,而 外循环是 根据 i 进行 循环的,
所以你要 把 内循环的 i 改成一个 临时变量 t, 修改如下:
public static void main(String[] args){
int count = 0;
for (int i = 100; i <= 999; i++) {
double result = 0;
int t = i;
for (int j = 0; j < 3; j++) {
result = result + Math.pow(t % 10, 3);
t = t / 10;
}
if (result == i) {
count++;
}
}
System.out.println("水仙花数有 : " + count + "个");
}
你每次i都变成0了,怎么会退出呢,这就是个死循环,你还没有主动break,最终就是StackOverflowError
该回答引用GPT:
在代码中,第二个循环内变量'i'的值被改变了,导致第二个循环没有正常结束。具体来说,第二个循环内i的值被改成了1,但其值范围并没有在第二个循环的上界限制内。因此,程序一直在第二个循环内执行,导致程序无法跳出。为了解决这个问题,可以在第二个循环内声明另一个变量j,初始值为i,并在第二层循环内对j进行操作。具体代码如下:
public static void main(String[] args) {
int count = 0;
for (int i = 100; i <= 999; i++) {
int j = i;
double result = 0;
for (int k = 0; k < 3; k++) {
result = result + Math.pow(j % 10, 3);
j = j / 10;
}
if (result == i) {
count++;
}
}
System.out.println("水仙花数有 : " + count + "个");
}
这里,在第二个循环内我们声明了一个新的变量j,初始值为i,这样就可以在第二个循环内使用j而不改变i的值,保证了i的值可以在第一个循环内正常遍历。同时,也更好地符合变量的单一职责原则,提高了代码可读性和可维护性。
如还有疑问,可留言帮助解决。
i = i / 10;
i不会达到循环退出条件。
二叉搜索树的定义:
二叉查找树(Binary Search Tree)
,(又:二叉搜索树,二叉排序树) 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAX_NODE_SIZE 5001
//递归:树
void inorder(struct TreeNode *node, int *res, int *pos) {
if (node != NULL) { //如果结点不为空
//中序遍历:左->根->右
inorder(node->left, res, pos);
res[(*pos)++] = node->val;
inorder(node->right, res, pos);
}
}
int* getAllElements(struct TreeNode* root1, struct TreeNode* root2, int* returnSize) {
//申请两个:表示定义一个int类型的指针变量num1,num2
//并申请 MAX_SIZE*sizeof(int) 个字节(即4 * MAX_SIZE 个字节)的存储空间。
int *nums1 = (int *)malloc(sizeof(int) * MAX_NODE_SIZE);
int *nums2 = (int *)malloc(sizeof(int) * MAX_NODE_SIZE);
int pos1 = 0, pos2 = 0;
//中序遍历两个二叉搜索树
inorder(root1, nums1, &pos1);
inorder(root2, nums2, &pos2);
int *merged = (int *)malloc(sizeof(int) * (pos1 + pos2));
int p1 = 0, p2 = 0;
int pos = 0;
while (true) {
if (p1 == pos1) {
memcpy(merged + pos, nums2 + p2, sizeof(int) * (pos2 - p2));
break;
}
if (p2 == pos2) {
memcpy(merged + pos, nums1 + p1, sizeof(int) * (pos1 - p1));
break;
}
if (nums1[p1] < nums2[p2]) {
merged[pos++] = nums1[p1++];
} else {
merged[pos++] = nums2[p2++];
}
}
*returnSize = pos1 + pos2;
return merged;
}