电文解密1:
电文加密的算法是:将字母A变成字母G,a变成g,B变成H,b变成h,依此类推,并且U变成 A,V变成B,等等,如果输入的是非字母字符,则保持不变。编写程序,从键盘输入一个电文字符,输出其相应的密码。
输入格式:
按照题目要求输入任意字符
输出格式:
只输出相应的密码字符
输入样例:
在这里给出一组输入。例如:
A
输出样例:
在这里给出相应的输出。例如:
G
代码:
#include<stdio.h>
int main()
{
int i=0;
char str[100];
gets(str);
while(str[i]!='\0'){
if(str[i]>='A'&&str[i]<='Z')
str[i]=(str[i]+6-'A')%26+'A';
if(str[i]>='a'&&str[i]<='z')
str[i]=(str[i]+6-'a')%26+'a';
i++;
}
puts(str);
return 0;
}
(加密)
电文解密2:
Mike给他的女朋友Alice写了一封情书,但不想情书被别人截取后知晓其中的内容,于是他想到了一种简单的加密方法。他想到的方法很简单,就是把文中出现的每一个字母以它后面的第3个字母代替,文中出现的其他符号如数字、空格及标点符号等仍保持不变。即:
A-->D, B-->E, ..., W-->Z, X-->A, Y-->B, Z-->C
a-->d, b-->e, ..., w-->z, x-->a, y-->b, z-->c
现在,Alice收到了Mike写给她的情书,请你写一个程序,将这封情书进行解密,并将加密前的内容输出。
假设该情书仅包含一段文字。
输入格式:
Mike写给Alice加密后的情书。
输出格式:
解密后的情书。
输入样例:
Ghdu Dolfh, L'g olnh wr vhh brx lq wkh qruwkhdvw fruqhu ri whdfklqj exloglqj 3 wrpruurz hyhqlqj.
输出样例:
Dear Alice, I'd like to see you in the northeast corner of teaching building 3 tomorrow evening.
代码:
#include<stdio.h>
#include<ctype.h>
char decrypt(char ch){
if(isalpha(ch)){
if(isupper(ch)){
return'A'+(ch-'A'-3+26)%26;
}else{
return'a'+(ch-'a'-3+26)%26;
}
}return ch;
}
int main(){
char ch;
while((ch=getchar())!=EOF){
putchar(decrypt(ch));
}
return 0;
}
(注意是解密)
电文解密3:
有一电文,已按下列规律译成密文:
A→Z a→z
B→Y b→y
C→X c→x
即第一个字母变成第 26 个字母,第 i 个字母变成第(26-i+1)个字母。非字母字符不变。编写一个程序将密码译成原文,输入密文输出原文。
输入格式:
在一行中输入密文字符串
输出格式:
在一行中输出原文字符串
输入样例:
在这里给出一组输入。例如:
abcdefg
输出样例:
在这里给出相应的输出。例如:
zyxwvut
代码:
#include <stdio.h>
#include <ctype.h> // 引入字符处理函数
// 函数用于将大写字母转换为对应的原文字符
char decryptUpper(char ch) {
if (ch >= 'A' && ch <= 'Z') {
return 'A' + ('Z' - ch);
}
return ch; // 非字母字符不变
}
// 函数用于将小写字母转换为对应的原文字符
char decryptLower(char ch) {
if (ch >= 'a' && ch <= 'z') {
return 'a' + ('z' - ch);
}
return ch; // 非字母字符不变
}
int main() {
char cipherText[1000]; // 假设密文不超过999个字符
fgets(cipherText, sizeof(cipherText), stdin); // 读取一行密文
// 遍历密文中的每个字符,进行解密
for (int i = 0; cipherText[i] != '\0'; ++i) {
if (isupper(cipherText[i])) { // 如果是大写字母
cipherText[i] = decryptUpper(cipherText[i]);
} else if (islower(cipherText[i])) { // 如果是小写字母
cipherText[i] = decryptLower(cipherText[i]);
}
// 非字母字符保持不变
}
// 输出原文
printf("%s", cipherText);
return 0;
}
计算sinx
从键盘输入x和n的值,利用下面的公式
编程计算sinx的值。
输入格式:
请在一行中输入x和n的值,中间用逗号分隔,其中x为double型变量,n为int型变量
输出格式:
只输出计算结果,并保留4位小数
输入样例:
在这里给出一组输入。例如:
0.5,9
输出样例:
在这里给出相应的输出。例如:
0.4794
法一 :
#include <stdio.h>
#include <math.h>
int main()
{
double x, result = 0;
int n, i;
scanf("%lf,%d", &x, &n);
for (i = 0; i < n; i++)
{
result += pow(-1, i) * pow(x, 2 * i + 1) / tgamma(2 * i + 2);
}
printf("%.4f\n", result);
return 0;
}
tgamma(n+1)是求n的阶乘
法二:
#include <stdio.h>
#include <math.h>
int main()
{
double x, result;
int n, i;
scanf("%lf,%d", &x, &n);
double tmp = x;
result = x;
for (i = 3; i <= (2 * n - 1); i+=2)
{
tmp = -1 * tmp * x * x / (i * (i - 1));
result += tmp;
}
printf("%.4f\n", result);
return 0;
}
被3整除
写一个程序,要求:输入一个任意长度(不超过100)的正整数,判断其能否被3整除,若能则输出Yes,否则输出No.
如输入:123
则输出:Yes
若输入:10243561201245985214702354878
则输出:No
输入格式:
一个长度不超过100的正整数
输出格式:
Yes or No
输入样例:
10243561201245985214702354878
输出样例:
No
代码:
#include <stdio.h>
#include <string.h>
int main() {
char num[101];
scanf("%s", num);
int total = 0;
for (int i = 0; i < strlen(num); i++) {
total += num[i] - '0';
}
if (total % 3 == 0) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
(题目给的长度不超过100,可能会超过int 类型,所以用数组接受,求和)
二分法求方程的根
对于大多数方程f(x)=0 来讲,不存在确定的求根公式,从而求精确的根非常困难,甚至不可能。但如果函数f(x)在闭区间[a,b]上是单调函数,且f(a)f(b)<0,则必存在x∗∈(a,b),使得f(x∗)=0,则可以使用如下方法近似求得x∗。
(1) 记区间端点为x1和x2,然后计算区间的中点x0,若∣f(x0)∣≤10−6,即∣f(x)∣≈0,此时x0即为方程的根;否则x0可将区间(x1,x2)二分为(x1,x0)和(x0,x2)。这时,为了确定下一次求根的区间,必须判断方程的根在哪一个区间内,由于方程的根所在区间的两个端点处的函数值的符号一定是相反的。也就是说,如果f(x0)与f(x1)是异号的,则根一定在左区间(x1,x0)内,否则根一定在右区间(x0,x2)内。
(2) 对根所在区间继续二分,直到∣f(x0)∣≤10−6,即∣f(x0)∣≈0时,则认为x0是方程f(x)=0的近似根。
(3)当函数f(x)在区间两端点的函数值同号时,函数在此区间无根或有不少于2个根,此时,不适用二分法求解。
根据上述算法,请计算方程x3−2x+1=0的近似根,小数点后保留4位小数。
输入格式:
以空格分隔的两个数x1和x2,用于表示一个区间,且x1<x2。
输出格式:
给定区间有根时,输出一个实数,无根或多于1个根时输出一个字符串"no roots!",输出时不含引号。
输入样例:
0.75 1.25
输出样例:
1.0000
代码:
#include <stdio.h>
#include <math.h>
// 定义方程f(x)
double f(double x) {
return x * x * x - 2 * x + 1;
}
// 二分法求根
double bisection(double x1, double x2, double epsilon) {
double x0, fx0, fx1, fx2;
while (x2 - x1 > epsilon) {
x0 = (x1 + x2) / 2;
fx0 = f(x0);
fx1 = f(x1);
fx2 = f(x2);
// 检查根所在的区间
if (fx0 * fx1 < 0) {
x2 = x0;
} else {
x1 = x0;
}
}
return (x1 + x2) / 2; // 返回近似根
}
int main() {
double x1, x2;
double epsilon = 1e-6; // 精度要求
// 读取输入
scanf("%lf %lf", &x1, &x2);
// 检查区间端点函数值是否异号
if (f(x1) * f(x2) >= 0) {
printf("no roots!\n");
} else {
// 使用二分法求根
double root = bisection(x1, x2, epsilon);
printf("%.4f\n", root); // 输出近似根,保留4位小数
}
return 0;
}