user-0 提问: 求教C语言问题Googol String

回复:
user: user-0
content: 引用 3 楼 user-1的回复:注解在这 https://blog.csdn.net/qq_40946921/article/details/93347548 while(true)这句代码能行吗？反正我不行。最后一次的代码改成了while(1)，终于通过了。不错哦，兄弟

user: user-1
content: 上面发错了  #include<stdio.h> #include<math.h> int find(long long x, long long k) { 	int t = 0; 	while (true) { 		long long mid = ((long long)1 << (x - 1));        //注意此处的数据类型 		if (k == mid) 			return t; 		else if (k > mid) {        //如果在右侧，折半取反 			t = !t; 			k = (mid << 1) - k; 		} 		x--; 	} } int main() { 	int n; 	long long max, k; 	scanf("%d", &n); 	for (int i = 1; i <= n; i++) { 		scanf("%lld", &k); 		max = ceill(log2l(k + 1));        //最多只需要在第log2(k)个字符中查找字符k（注意向上取整以及数据类型） 		printf("case %d:%d\n", i, find(max, k)); 	} 	return 0; }

user: user-1
content: 发现问题了，数据类型不符导致溢出  [code=c]#include<stdio.h> #include<math.h> int find(long long x, long long k) { 	int t = 0; 	while (true) { 		long long mid = ((long long)1 << (x - 1));		//注意此处的数据类型 		if (k == mid) 			return t; 		else if (k > mid) {        //如果在右侧，折半取反 			t = !t; 			k = (mid << 1) - k; 		} 		x--; 	} } int main() { 	int n; 	long long max, k; 	scanf("%d", &n); 	for (int i = 1; i <= n; i++) { 		scanf("%lld", &k); 		max = ceill(log2l(k + 1));        //最多只需要在第log2(k)个字符中查找字符k（注意向上取整以及数据类型） 		printf("case %d:%d\n", i, find(max, k - 1)); 	} 	return 0; } [/code]

user: user-0
content: 引用 3 楼 user-1的回复:注解在这 https://blog.csdn.net/qq_40946921/article/details/93347548 while(true)不能用吧！我改成了while(1)，然后还是时间超限

user: user-1
content: 那可能是因为递归太慢了吧 再不行我也没办法咯  #include<stdio.h> #include<math.h> int find(long long x, long long k) { 	int t = 0; 	while (true) { 		int mid = (1 << (x - 1)); 		if (k == mid) 			return t; 		else if (k > mid) {		//如果在右侧，折半取反 			t = !t; 			k = (mid << 1) - k; 		} 		x--;	 	} } int main() { 	int n; 	long long max, k; 	scanf("%d", &n); 	for (int i = 1; i <= n; i++) { 		scanf("%lld", &k); 		max = ceill(log2l(k + 1));        //最多只需要在第log2(k)个字符中查找字符k（注意向上取整以及数据类型） 		printf("case %d:%d\n", i, find(max, k)); 	} 	return 0; }

user: user-0
content: 引用 1 楼 user-1的回复:这题目也真麻烦的，算是数学题吧，推算老半天（还是不要贴翻译的题目，好多句子有歧义，看半天才看懂题目）  #include<stdio.h> #include<math.h> int find(long long x, long long k) { 	int mid = (1 << (x - 1));		 	if (k == mid)		//如果在中间说明为0 		return 0; 	else if (k < mid)	//如果在左边说明跟上一字符串的同一位置相同 		return find(x - 1, k); 	else 		return !find(x - 1, (mid << 1) - k);	//右边的话就是上一字符串对称位置的反转 } int main(){ 	int n; 	long long max, k; 	scanf("%d", &n); 	for (int i = 1; i <= n; i++) { 		scanf("%lld", &k); 		max = ceill(log2l(k + 1));		//最多只需要在第log2(k)个字符中查找字符k（注意向上取整以及数据类型） 		printf("case %d:%d\n", i, find(max, k)); 	} 	return 0; }   代码提交后超过时间运行上限，这是怎么回事，算法太复杂了？

user: user-1
content: 注解在这 https://blog.csdn.net/qq_40946921/article/details/93347548

user: user-0
content: 引用 1 楼 user-1的回复:这题目也真麻烦的，算是数学题吧，推算老半天（还是不要贴翻译的题目，好多句子有歧义，看半天才看懂题目）  #include<stdio.h> #include<math.h> int find(long long x, long long k) { 	int mid = (1 << (x - 1));		 	if (k == mid)		//如果在中间说明为0 		return 0; 	else if (k < mid)	//如果在左边说明跟上一字符串的同一位置相同 		return find(x - 1, k); 	else 		return !find(x - 1, (mid << 1) - k);	//右边的话就是上一字符串对称位置的反转 } int main(){ 	int n; 	long long max, k; 	scanf("%d", &n); 	for (int i = 1; i <= n; i++) { 		scanf("%lld", &k); 		max = ceill(log2l(k + 1));		//最多只需要在第log2(k)个字符中查找字符k（注意向上取整以及数据类型） 		printf("case %d:%d\n", i, find(max, k)); 	} 	return 0; }   不好意思，题目原来是英文，我通过百度翻译得来的中文

user: user-1
content: 这题目也真麻烦的，算是数学题吧，推算老半天（还是不要贴翻译的题目，好多句子有歧义，看半天才看懂题目）  #include<stdio.h> #include<math.h> int find(long long x, long long k) { 	int mid = (1 << (x - 1));		 	if (k == mid)		//如果在中间说明为0 		return 0; 	else if (k < mid)	//如果在左边说明跟上一字符串的同一位置相同 		return find(x - 1, k); 	else 		return !find(x - 1, (mid << 1) - k);	//右边的话就是上一字符串对称位置的反转 } int main(){ 	int n; 	long long max, k; 	scanf("%d", &n); 	for (int i = 1; i <= n; i++) { 		scanf("%lld", &k); 		max = ceill(log2l(k + 1));		//最多只需要在第log2(k)个字符中查找字符k（注意向上取整以及数据类型） 		printf("case %d:%d\n", i, find(max, k)); 	} 	return 0; }