求教C语言问题Googol String

学计算机的小白 2019-06-22 04:40:29
问题描述
“0/1字符串”是一个字符串,其中每个字符都是0或1。可以对0/1字符串执行两个操作:
切换:每0变为1,每1变为0。例如,“100”变为“011”。
反转:字符串反转。例如,“100”变为“001”。
考虑这个0/1字符串的无限序列。
S0=“”
s1=“0”
s2=“001”
s3=“0010011”
S4=“001100011011”
……
sn=sn-1+“0”+开关(反向(sn-1))
你需要找出sgoogol的第k个字符,其中googol=10^100
输入说明
第一行输入给出了测试用例的数量t(1<=t<=100)。下一行的每一行都包含一个数字k(1<=k<=10^18)。
输出描述
对于每个测试用例,输出一行包含“case x:y”,其中x是测试用例编号(从1开始),y是sgoogol的第k个字符。
样本输入





十二
样品输出
案例1:0
案例2:0
案例3:1
案例4:0
案例5:1
...全文
223 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 Italink的回复:
注解在这
https://blog.csdn.net/qq_40946921/article/details/93347548
while(true)这句代码能行吗?反正我不行。最后一次的代码改成了while(1),终于通过了。不错哦,兄弟
Italink 2019-06-22
  • 打赏
  • 举报
回复
上面发错了

#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;
}
Italink 2019-06-22
  • 打赏
  • 举报
回复
发现问题了,数据类型不符导致溢出

[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]
  • 打赏
  • 举报
回复
引用 3 楼 Italink的回复:
注解在这
https://blog.csdn.net/qq_40946921/article/details/93347548
while(true)不能用吧!我改成了while(1),然后还是时间超限
Italink 2019-06-22
  • 打赏
  • 举报
回复
那可能是因为递归太慢了吧
再不行我也没办法咯

#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;
}
  • 打赏
  • 举报
回复
引用 1 楼 Italink的回复:
这题目也真麻烦的,算是数学题吧,推算老半天(还是不要贴翻译的题目,好多句子有歧义,看半天才看懂题目)

#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;
}

代码提交后超过时间运行上限,这是怎么回事,算法太复杂了?
Italink 2019-06-22
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 1 楼 Italink的回复:
这题目也真麻烦的,算是数学题吧,推算老半天(还是不要贴翻译的题目,好多句子有歧义,看半天才看懂题目)

#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;
}

不好意思,题目原来是英文,我通过百度翻译得来的中文
Italink 2019-06-22
  • 打赏
  • 举报
回复
这题目也真麻烦的,算是数学题吧,推算老半天(还是不要贴翻译的题目,好多句子有歧义,看半天才看懂题目)

#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;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧