两道C语言编程题题,求解!
1.恺撒大帝是古罗马共和国末期著名的统帅和政治家。虽然他一生从未登上过皇位,但是直到今天在西方国家,他的名字仍是君主的代名词。他博学多才、文武双全,既是卓越的军事家又是雄...
1.恺撒大帝是古罗马共和国末期著名的统帅和政治家。虽然他一生从未登上过皇位,但是直到今天在西方国家,他的名字仍是君主的代名词。他博学多才、文武双全,既是卓越的军事家又是雄辩的文学家。而恺撒密码正是这位伟大的君主发明的。话说在恺撒大帝出征时,为了避免军令落入敌军手中而泄漏军情,他自己发明了一种单字替代密码。所谓“单字替代密码”就是把明文中的每个字母用密文中的对应字母替代,明文字符集与密文字符集是 一一对应的关系。而恺撒密码就属于一种简化的单字替换密码。恺撒密码,又叫恺撒移位密码,它是将字母表中的字母依次后移一定的位置得到的,例如后移3位:
明码表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
所以后移5位的时候:
明文 F O R E S T
密文 K T W J X Y
其实恺撒密码挺容易被破解...因为就那么26种...虽然这么简单,但还是有着很大的用初,现在需要你写一个程序能够对任意移位K(K大于0表示向后移位,小于0表示向前移位),下的明文进行加密。
Input
输入的第一行为小于100的正整数 n ,代表计算的数据组个数。然后是 n 组数据输入, 每一组输入包括2行, 第1行是 K 值, -26< K < 26;第2行是明文串,其长度不超过 100 个字符(包含26个大小写字符,不包含空格)。
Output
输出其密文
2.在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环 特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小 化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产 生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之 间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫雷反射码 或循环码。下表为几种自然二进制码与格雷码的对照表:
十进制数 自然二进制数 格雷码
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000
二进制格雷码与自然二进制码的互换
1、自然二进制码转换成二进制格雷码.自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
2、二进制格雷码转换成自然二进制码。二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
Input
输入一个十进制整数M
Output
输出十进制整数M对应的格雷码
Sample Input
2
13
Sample Output
11
1011
第二题啊!!!能不能来个通俗易懂的啊!!! 展开
明码表:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密码表:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
所以后移5位的时候:
明文 F O R E S T
密文 K T W J X Y
其实恺撒密码挺容易被破解...因为就那么26种...虽然这么简单,但还是有着很大的用初,现在需要你写一个程序能够对任意移位K(K大于0表示向后移位,小于0表示向前移位),下的明文进行加密。
Input
输入的第一行为小于100的正整数 n ,代表计算的数据组个数。然后是 n 组数据输入, 每一组输入包括2行, 第1行是 K 值, -26< K < 26;第2行是明文串,其长度不超过 100 个字符(包含26个大小写字符,不包含空格)。
Output
输出其密文
2.在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环 特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小 化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产 生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之 间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫雷反射码 或循环码。下表为几种自然二进制码与格雷码的对照表:
十进制数 自然二进制数 格雷码
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000
二进制格雷码与自然二进制码的互换
1、自然二进制码转换成二进制格雷码.自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
2、二进制格雷码转换成自然二进制码。二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
Input
输入一个十进制整数M
Output
输出十进制整数M对应的格雷码
Sample Input
2
13
Sample Output
11
1011
第二题啊!!!能不能来个通俗易懂的啊!!! 展开
3个回答
展开全部
(1)
#include <stdio.h>
void main(){
int i,j,n,K;
char s[100],x;
scanf("%d",&n);
for (j=0;j<n;j++){
scanf("%d\n",&K);
gets(s);
for (i=0;i<strlen(s);i++) {
x = s[i];
if ( (s[i] >= 'a') && (s[i] <= 'z') ) {
x = s[i]+K;
if (x > 'z') x = x - 26;
if (x < 'a') x = x + 26;
};
if ( (s[i] >= 'A') && (s[i] <= 'Z') ){
x = s[i]+K;
if (x > 'Z') x = x - 26;
if (x < 'A') x = x + 26;
}
printf("%c",x); };
printf("\n");
};
exit(0);
}
(2)
题意不清,是不是输入数在0-15之间。也就是4bit数。否则什么叫“最高位”?
只有4bit,也就是不必去做位运算,查表code[16][5]就可以了。
#include <stdio.h>
void main(){
int d;
char code[16][5]={"0000","0001","0011","0010","0110","0111",
"0101","0100","1100","1101","1111","1110",
"1010","1011","1001","1000"};
printf("input n\n");
scanf("%d",&d);
printf("%s",code[d]);
}
#include <stdio.h>
void main(){
int i,j,n,K;
char s[100],x;
scanf("%d",&n);
for (j=0;j<n;j++){
scanf("%d\n",&K);
gets(s);
for (i=0;i<strlen(s);i++) {
x = s[i];
if ( (s[i] >= 'a') && (s[i] <= 'z') ) {
x = s[i]+K;
if (x > 'z') x = x - 26;
if (x < 'a') x = x + 26;
};
if ( (s[i] >= 'A') && (s[i] <= 'Z') ){
x = s[i]+K;
if (x > 'Z') x = x - 26;
if (x < 'A') x = x + 26;
}
printf("%c",x); };
printf("\n");
};
exit(0);
}
(2)
题意不清,是不是输入数在0-15之间。也就是4bit数。否则什么叫“最高位”?
只有4bit,也就是不必去做位运算,查表code[16][5]就可以了。
#include <stdio.h>
void main(){
int d;
char code[16][5]={"0000","0001","0011","0010","0110","0111",
"0101","0100","1100","1101","1111","1110",
"1010","1011","1001","1000"};
printf("input n\n");
scanf("%d",&d);
printf("%s",code[d]);
}
追问
应该是任意的十进制数吧!最高位就是左边的。。高位就是该位左边的一位。次高位就应该是对应的该位
展开全部
考虑到格雷码的用途,它的位数一般是固定的。所以,你应该说明转换几位的,这样有针对性。
下面我写的是八位的,很简单
#include <stdio.h>
void main()
{
unsigned char a, b, c;
a = 0xff;
b = a >> 1;
c = a ^ b;
printf("%x",c); //输出十六进制,c即为所求格雷码
}
再说一句,格雷码与二进制码转换的公式:
格雷码第n位 = 二进位码第(n+1)位 异或 二进制码第n位
下面我写的是八位的,很简单
#include <stdio.h>
void main()
{
unsigned char a, b, c;
a = 0xff;
b = a >> 1;
c = a ^ b;
printf("%x",c); //输出十六进制,c即为所求格雷码
}
再说一句,格雷码与二进制码转换的公式:
格雷码第n位 = 二进位码第(n+1)位 异或 二进制码第n位
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
nt main()
{
int m,l;
double r=1.0;
printf("please input m: ");
scanf("%d",&m);
for(l=2;l<=m;l++)
{
r=r-(1.0/(l*l));
}
printf("\nt=%f\n",r);
return 0;
}
2:
#include "stdio.h"
int main()
{
int l1,l2;
int matrix[4][4];
int diagonal[4];
for(l1=0;l1<4;l1++)//输入
for(l2=0;l2<4;l2++)
{
printf("\nplease input Row %d Column %d: ",l1,l2);
scanf("%d",matrix[l1]+l2);
}
printf("\nmain diagonal is:\n");
for(l1=0;l1<4;l1++)//取主对角线上的数
{
diagonal[l1]=matrix[l1][l1];
}
for(l1=0;l1<3;l1++)//排序
for(l2=l1+1;l2<4;l2++)
{
if(diagonal[l2]<diagonal[l1])
{
diagonal[l2]=diagonal[l2]^diagonal[l1];
diagonal[l1]=diagonal[l2]^diagonal[l1];
diagonal[l2]=diagonal[l2]^diagonal[l1];
}
}
for(l1=0;l1<4;l1++)//输出
{
printf("%d\t",diagonal[l1]);
}
printf("\n");
return 0;
}
{
int m,l;
double r=1.0;
printf("please input m: ");
scanf("%d",&m);
for(l=2;l<=m;l++)
{
r=r-(1.0/(l*l));
}
printf("\nt=%f\n",r);
return 0;
}
2:
#include "stdio.h"
int main()
{
int l1,l2;
int matrix[4][4];
int diagonal[4];
for(l1=0;l1<4;l1++)//输入
for(l2=0;l2<4;l2++)
{
printf("\nplease input Row %d Column %d: ",l1,l2);
scanf("%d",matrix[l1]+l2);
}
printf("\nmain diagonal is:\n");
for(l1=0;l1<4;l1++)//取主对角线上的数
{
diagonal[l1]=matrix[l1][l1];
}
for(l1=0;l1<3;l1++)//排序
for(l2=l1+1;l2<4;l2++)
{
if(diagonal[l2]<diagonal[l1])
{
diagonal[l2]=diagonal[l2]^diagonal[l1];
diagonal[l1]=diagonal[l2]^diagonal[l1];
diagonal[l2]=diagonal[l2]^diagonal[l1];
}
}
for(l1=0;l1<4;l1++)//输出
{
printf("%d\t",diagonal[l1]);
}
printf("\n");
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询