有没有一捏 约瑟夫环
7-5 有没有一捏
题目背景
一个神秘的数字解码器被用来识别和分析城市监控系统中的加密信号。这些信号用二进制代码表示,二进制值代表了不同类型的安全信息,当二进制值的最后一位为0时,代表该信号是安全的,不会造成网络威胁,如果最后一位是1的,则该信号是1,有潜在的网络威胁。作为一名才华横溢的网络工程师,你被委以重任——编写一个程序用于数字解码器以快速识别这些信号,以帮助保护城市免受潜在的网络威胁。
输入格式:
输入一个整数n(1≤n≤2^63−1),代表二进制信号的十进制形式。
输出格式:
如果该信号是安全的,输出一行Safe
,否则输出Danger
。
输入样例:
在这里给出一组输入。例如:
6
输出样例:
在这里给出相应的输出。例如:
Safe
数据规模与约定:
本题共有 10 个测试点。
对于 80% 的数据,保证1≤n≤2^31 − 1。
对于 20% 的数据,保证2^31≤n≤2^63 − 1。
解题思路:
1.由题可知,题目要求我们根据输入数据的二进制的最后一位来判断该数是否是安全的,因此只需要获取输入数据的二进制的最后一位即可
2.我们可以知道,获取一个数的二进制的方法是除2取余,得出的余数由下往上即为该数的二进制,因此我们第一次除2取余获取的余数即为该数二进制的最后一位
3.所以,只需要对读入的数据%2,获取计算的结果,再依据结果为0或为1判断是否Safe
#include<stdio.h> int main() { int n; scanf("%d",&n); int number = n%2; if(number == 0){ printf("Safe"); } else{ printf("Danger"); } return 0; }
7-7 约瑟夫环
有N个人围成一圈(编号为1~N),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的编号是多少?
输入格式:
在一行中给出1个不超过100的正整数N。
输出格式:
在一行中输出最后剩下那个人的编号。
输入样例:
10
输出样例:
4 1
解题思路:
1.先根据输入的人数新建一个record[]数组,数组长度为n+1(1-n方便得出结果),将其所有数据初始化为1,用于判断该数据是否被移除
2.count用来记录所有未被移除的数据个数;flag用于作为获取数据的指针,随着循环的进行往下读取,到数组尾后变为1重新继续读取;number用于记录每个人报的数,当报数为3时进行操作然后将number设置为1
3.首先根据record[flag]的值进行判断
(1)为0则不进行操作
(2)为1则说明该位置还有未退出的人,则进行判断到这个人时报的数为多少,如果为3,即number==3时,将record[flag]=0,并将count-1表示这个人退出,并将报数number置1
(3)执行完以上操作都要根据flag的长度将flag+1或置1,保证程序不断遍历record数组
4.循环的退出条件是最后只剩一个人,即count==1,跳出循环后则遍历数组,找出record数组中最后剩下的人(根据0/1判断)
#include<stdio.h> int main() { int n; scanf("%d",&n); int record[n+1]; for(int i=1;i<=n;i++){ record[i] = 1; } int count = n; int flag = 1; int number = 1; while(count>1){ if(record[flag]) { if (number == 3) { record[flag] = 0; count--; number = 1; }else { number++; } } if(flag!=n){ flag++; }else{ flag = 1; } } for(int i=1;i<=n;i++){ if(record[i]){ printf("%d",i); break; } } }