8.5 练习

电文解密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的值,利用下面的公式

微信图片\_20220318144658.png

编程计算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;  
}

 

 

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值